Panggilan Sistem Paip di C

Pipe System Call C



paip () adalah fungsi sistem Linux. The paip () fungsi sistem digunakan untuk membuka deskriptor file, yang digunakan untuk berkomunikasi antara proses Linux yang berlainan. Ringkasnya, yang paip () fungsi digunakan untuk komunikasi antara proses di Linux. Dalam artikel ini, saya akan menunjukkan kepada anda cara menggunakan fungsi sistem paip () di Linux. Jadi, mari kita mulakan.

Sintaks bagi paip () fungsi adalah:







intpaip(intpipefd[2]);

Di sini, fungsi paip () membuat saluran data searah untuk komunikasi antara proses. Anda lulus dalam int Susunan jenis (Integer) pipefd terdiri daripada 2 elemen larik ke paip fungsi (). Kemudian fungsi paip () membuat dua deskriptor fail di pipefd susunan.



Unsur pertama dari pipefd susunan, pipefd [0] digunakan untuk membaca data dari paip.



Unsur kedua dari pipefd susunan, pipefd [1] digunakan untuk menulis data ke paip.





Pada kejayaan, fungsi paip () mengembalikan 0. Sekiranya kesalahan berlaku semasa inisialisasi paip, maka fungsi paip () kembali -1.

Fungsi paip () ditentukan dalam tajuk unistd.h . Untuk menggunakan fungsi paip () dalam program C anda, anda mesti memasukkan tajuknya unistd.h seperti berikut:



#sertakan

Untuk maklumat lebih lanjut mengenai fungsi sistem paip (), periksa halaman manual paip () dengan arahan berikut:

$ lelaki2paip
Halaman man paip().

Contoh 1:

Untuk contoh pertama, buat fail sumber C baru 1_paip.c dan taipkan baris kod berikut.

#sertakan
#sertakan
#sertakan

intutama(batal) {
intpipefds[2];

sekiranya(paip(pipefds) == -1) {
kesalahan ('paip');
jalan keluar (EXIT_FAILURE);
}

printf ('Baca Fail Deskriptor Nilai:% d n',pipefds[0]);
printf ('Tulis Deskriptor Fail Nilai:% d n',pipefds[1]);

kembaliKECUALI_ KEBERHASILAN;
}

Di sini, saya memasukkan fail tajuk () unistd.h pertama dengan baris berikut.

#sertakan

Kemudian, di utama () fungsi, saya menentukan pipefds dua unsur bilangan bulat dengan baris berikut.

intpipefds[2];

Kemudian, saya menjalankan fungsi paip () untuk memulakan array deskriptor fail pipefds seperti berikut.

paip(pipefds)

Saya juga memeriksa kesilapan menggunakan nilai kembali fungsi paip (). Saya menggunakan keluar () berfungsi untuk menghentikan program sekiranya fungsi paip gagal.

sekiranya(paip(pipefds) == -1) {
kesalahan ('paip');
jalan keluar (EXIT_FAILURE);
}

Kemudian, saya mencetak nilai deskriptor fail paip baca dan tulis pipefds [0] dan pipefds [1] masing-masing.

printf ('Baca Fail Deskriptor Nilai:% d n',pipefds[0]);
printf ('Menulis Penerangan Fail Nilai:% d n',pipefds[1]);

Sekiranya anda menjalankan program, anda akan melihat output berikut. Seperti yang anda lihat, nilai deskriptor fail paip baca pipefds [0] adalah 3 dan tuliskan deskriptor fail paip pipefds [1] adalah 4 .

Contoh 2:

Buat fail sumber C yang lain 2_paip.c dan taipkan baris kod berikut.

#sertakan
#sertakan
#sertakan
#sertakan

intutama(batal) {
intpipefds[2];
charpenyangga[5];

sekiranya(paip(pipefds) == -1) {
kesalahan ('paip');
jalan keluar (EXIT_FAILURE);
}

char *sematkan= '4128 0';

printf ('Menulis PIN ke paip ... n');
menulis(pipefds[1],sematkan, 5);
printf ('Selesai. n n');

printf ('Membaca PIN dari paip ... n');
membaca(pipefds[0],penyangga, 5);
printf ('Selesai. n n');

printf ('PIN dari paip:% s n',penyangga);

kembaliKECUALI_ KEBERHASILAN;
}

Program ini pada dasarnya menunjukkan kepada anda cara menulis ke paip dan membaca data yang anda tulis dari paip tersebut.

Di sini, saya menyimpan kod PIN 4 aksara ke dalam char susunan. Panjang array ialah 5 (termasuk watak NULL 0).

char *sematkan= '4128 0';

Setiap watak ASCII berukuran 1 bait dalam C. Oleh itu, untuk menghantar PIN 4 digit melalui paip, anda mesti menulis 5 bait (4 + 1 karakter NULL) data ke dalam paip.

Untuk menulis 5 bait data ( sematkan ) ke dalam paip, saya menggunakan tulis () berfungsi menggunakan deskriptor fail paip tulis pipefds [1] seperti berikut.

menulis(pipefds[1],sematkan, 5);

Sekarang saya mempunyai beberapa data dalam paip, saya dapat membacanya dari paip menggunakan baca () berfungsi pada deskriptor fail paip baca pipefds [0] . Semasa saya menulis 5 bait data ( sematkan ) ke dalam paip, saya akan membaca 5 bait data dari paip juga. Data yang dibaca akan disimpan di penyangga susunan watak. Oleh kerana saya akan membaca 5 bait data dari paip, penyangga panjang watak mestilah sekurang-kurangnya 5 bait.

Saya telah menentukan penyangga susunan watak pada awal utama () fungsi.

charpenyangga[5];

Sekarang, saya dapat membaca PIN dari paip dan menyimpannya di penyangga susunan dengan baris berikut.

membaca(pipefds[0],penyangga, 5);

Sekarang setelah saya membaca PIN dari paip, saya dapat mencetaknya menggunakan printf () berfungsi seperti biasa.

printf ('PIN dari paip:% s n',penyangga);

Setelah saya menjalankan program, output yang betul ditunjukkan seperti yang anda lihat.

Contoh 3:

Buat fail sumber C baru 3_paip.c seperti ketikkan baris kod berikut.

#sertakan
#sertakan
#sertakan
#sertakan
#sertakan
intutama(batal) {
intpipefds[2];
char *sematkan;
charpenyangga[5];

sekiranya(paip(pipefds) == -1) {
kesalahan ('paip');
jalan keluar (EXIT_FAILURE);
}

pid_t pid=garpu();

sekiranya(pid== 0) { // dalam proses anak
sematkan= '4821 0'; // PIN untuk dihantar
tutup(pipefds[0]); // tutup baca fd
menulis(pipefds[1],sematkan, 5); // tulis PIN ke paip

printf ('Menjana PIN pada anak dan menghantar kepada ibu bapa ... n');
tidur(2); // kelewatan yang disengajakan
jalan keluar (KECUALI_ KEBERHASILAN);
}

sekiranya(pid> 0) { // dalam proses utama
tunggu(BULAN); // tunggu proses anak selesai
tutup(pipefds[1]); // tutup tulis fd
membaca(pipefds[0],penyangga, 5); // baca PIN dari paip
tutup(pipefds[0]); // tutup baca fd

printf ('Ibu bapa menerima PIN'% s ' n',penyangga);
}

kembaliKECUALI_ KEBERHASILAN;
}

Dalam contoh ini, saya menunjukkan cara menggunakan paip untuk komunikasi antara proses. Saya telah menghantar PIN dari proses anak ke proses ibu bapa menggunakan paip. Kemudian baca PIN dari paip dalam proses induk dan cetak dari proses induk.

Pertama, saya telah membuat proses anak menggunakan fungsi garpu ().

pid_t pid=garpu();

Kemudian, dalam proses anak ( pid == 0 ), Saya menulis PIN ke paip menggunakan tulis () fungsi.

menulis(pipefds[1],sematkan, 5);

Setelah PIN ditulis ke paip dari proses anak, proses ibu bapa ( pid> 0 ) membacanya dari paip menggunakan baca () fungsi.

membaca(pipefds[0],penyangga, 5);

Kemudian, proses ibu bapa mencetak PIN menggunakan printf () berfungsi seperti biasa.

printf ('Ibu bapa menerima PIN'% s ' n',penyangga);

Seperti yang anda lihat, menjalankan program memberikan hasil yang diharapkan.

Contoh 4:

Buat fail sumber C baru 4_paip.c seperti ketikkan baris kod berikut.

#sertakan
#sertakan
#sertakan
#sertakan
#sertakan

#tentukan PIN_LENGTH 4
#tentukan PIN_WAIT_INTERVAL 2

bataldapatkanPIN(charsematkan[PIN_LENGTH+ 1]) {
srand (getpid() +getppid());

sematkan[0] = 49 + barisan () % 7;

untuk(inti= 1;i<PIN_LENGTH;i++) {
sematkan[i] = 48 + barisan () % 7;
}

sematkan[PIN_LENGTH] = ' 0';
}


intutama(batal) {
sementara(1) {
intpipefds[2];
charsematkan[PIN_LENGTH+ 1];
charpenyangga[PIN_LENGTH+ 1];

paip(pipefds);

pid_t pid=garpu();

sekiranya(pid== 0) {
dapatkanPIN(sematkan); // jana PIN
tutup(pipefds[0]); // tutup baca fd
menulis(pipefds[1],sematkan,PIN_LENGTH+ 1); // tulis PIN ke paip

printf ('Menjana PIN pada anak dan menghantar kepada ibu bapa ... n');

tidur(PIN_WAIT_INTERVAL); // melambatkan penghasilan PIN dengan sengaja.

jalan keluar (KECUALI_ KEBERHASILAN);
}

sekiranya(pid> 0) {
tunggu(BULAN); // menunggu anak selesai

tutup(pipefds[1]); // tutup tulis fd
membaca(pipefds[0],penyangga,PIN_LENGTH+ 1); // baca PIN dari paip
tutup(pipefds[0]); // tutup baca fd
printf ('Ibu bapa menerima PIN'% s 'dari anak. n n',penyangga);
}
}

kembaliKECUALI_ KEBERHASILAN;
}

Contoh ini sama seperti Contoh 3 . Satu-satunya perbezaan adalah bahawa program ini secara berterusan membuat proses anak, menghasilkan PIN dalam proses anak dan menghantar PIN ke proses induk menggunakan paip.

Proses ibu bapa kemudian membaca PIN dari paip dan mencetaknya.

Program ini menghasilkan PIN_LENGTH PIN baru setiap PIN_WAIT_INTERVAL saat.

Seperti yang anda lihat, program ini berjalan seperti yang diharapkan.

Anda hanya boleh menghentikan program dengan menekan + C .

Jadi, ini adalah bagaimana anda menggunakan panggilan sistem paip () dalam bahasa pengaturcaraan C. Terima kasih kerana membaca artikel ini.