Panggilan Sistem Pipa di C

Pipe System Call C



pipa() adalah fungsi sistem Linux. NS pipa() fungsi sistem digunakan untuk membuka deskriptor file, yang digunakan untuk berkomunikasi antara proses Linux yang berbeda. Singkatnya, pipa() fungsi ini digunakan untuk komunikasi antar proses di Linux. Pada artikel ini, saya akan menunjukkan cara menggunakan fungsi sistem pipe() di Linux. Jadi, mari kita mulai.

Sintaks dari pipa() fungsinya adalah:







ke dalampipa(ke dalampipefd[2]);

Di sini, fungsi pipe() membuat saluran data searah untuk komunikasi antar-proses. Anda lulus dalam ke dalam (Bilangan bulat) jenis array pipefd terdiri dari 2 elemen array ke fungsi pipe(). Kemudian fungsi pipe() membuat dua deskriptor file di pipefd Himpunan.



Elemen pertama dari pipefd Himpunan, pipefd[0] digunakan untuk membaca data dari pipa.



Elemen kedua dari pipefd Himpunan, pipefd[1] digunakan untuk menulis data ke pipa.





Jika berhasil, fungsi pipe() mengembalikan 0. Jika terjadi kesalahan selama inisialisasi pipa, maka fungsi pipe() mengembalikan -1.

Fungsi pipe() didefinisikan di header unistd.h . Untuk menggunakan fungsi pipe() dalam program C Anda, Anda harus menyertakan header unistd.h sebagai berikut:



#termasuk

Untuk informasi lebih lanjut tentang fungsi sistem pipe(), periksa halaman manual pipe() dengan perintah berikut:

$ pria2pipa
Halaman manual pipa().

Contoh 1:

Untuk contoh pertama, buat file sumber C baru 1_pipe.c dan ketik baris kode berikut.

#termasuk
#termasuk
#termasuk

ke dalamutama(ruang kosong) {
ke dalampipefds[2];

jika(pipa(pipefds) == -1) {
kesalahan ('pipa');
keluar (EXIT_FAILURE);
}

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

kembaliEXIT_SUCCESS;
}

Di sini, saya menyertakan file header pipe() unistd.h pertama dengan baris berikut.

#termasuk

Kemudian, di utama() fungsi, saya mendefinisikan pipefds dua elemen array integer dengan baris berikut.

ke dalampipefds[2];

Kemudian, saya menjalankan fungsi pipe() untuk menginisialisasi array deskriptor file pipefds sebagai berikut.

pipa(pipefds)

Saya juga memeriksa kesalahan menggunakan nilai kembali dari fungsi pipe() . saya menggunakan keluar() berfungsi untuk terminal program jika fungsi pipa gagal.

jika(pipa(pipefds) == -1) {
kesalahan ('pipa');
keluar (EXIT_FAILURE);
}

Kemudian, saya mencetak nilai deskriptor file pipa baca dan tulis pipefd[0] dan pipefds[1] masing-masing.

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

Jika Anda menjalankan program, Anda akan melihat output berikut. Seperti yang Anda lihat, nilai deskriptor file pipa baca pipefd[0] adalah 3 dan tulis deskriptor file pipa pipefds[1] adalah 4 .

Contoh 2:

Buat file sumber C lain 2_pipe.c dan ketik baris kode berikut.

#termasuk
#termasuk
#termasuk
#termasuk

ke dalamutama(ruang kosong) {
ke dalampipefds[2];
arangpenyangga[5];

jika(pipa(pipefds) == -1) {
kesalahan ('pipa');
keluar (EXIT_FAILURE);
}

arang *pin= '4128 0';

printf ('Menulis PIN ke pipa... ');
menulis(pipefds[1],pin, 5);
printf ('Selesai. ');

printf ('Membaca PIN dari pipa... ');
Baca(pipefds[0],penyangga, 5);
printf ('Selesai. ');

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

kembaliEXIT_SUCCESS;
}

Program ini pada dasarnya menunjukkan kepada Anda cara menulis ke pipa dan membaca data yang Anda tulis dari pipa.

Di sini, saya menyimpan kode PIN 4 karakter ke dalam a arang Himpunan. Panjang array adalah 5 (termasuk karakter NULL ).

arang *pin= '4128 0';

Setiap karakter ASCII berukuran 1 byte dalam C. Jadi, untuk mengirim 4 digit PIN melalui pipa, Anda harus menulis 5 byte (4 + 1 karakter NULL) data ke dalam pipa.

Untuk menulis 5 byte data ( pin ) ke dalam pipa, saya menggunakan menulis() fungsi menggunakan deskriptor file pipa tulis pipefds[1] sebagai berikut.

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

Sekarang saya memiliki beberapa data di dalam pipa, saya dapat membacanya dari pipa menggunakan Baca() berfungsi pada deskriptor file pipa baca pipefd[0] . Seperti yang saya tulis 5 byte data ( pin ) ke dalam pipa, saya juga akan membaca 5 byte data dari pipa. Data yang dibaca akan disimpan di penyangga susunan karakter. Karena saya akan membaca 5 byte data dari pipa, penyangga array karakter harus memiliki panjang minimal 5 byte.

Saya telah mendefinisikan penyangga array karakter di awal utama() fungsi.

arangpenyangga[5];

Sekarang, saya dapat membaca PIN dari pipa dan menyimpannya di penyangga array dengan baris berikut.

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

Sekarang saya telah membaca PIN dari pipa, saya dapat mencetaknya menggunakan cetakf() berfungsi seperti biasa.

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

Setelah saya menjalankan program, output yang benar ditampilkan seperti yang Anda lihat.

Contoh 3:

Buat file sumber C baru 3_pipe.c sebagai ketik di baris kode berikut.

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
ke dalamutama(ruang kosong) {
ke dalampipefds[2];
arang *pin;
arangpenyangga[5];

jika(pipa(pipefds) == -1) {
kesalahan ('pipa');
keluar (EXIT_FAILURE);
}

pid_t pid=garpu();

jika(pid== 0) { // dalam proses anak
pin= '4821 0'; // PIN untuk dikirim
Menutup(pipefds[0]); // tutup baca fd
menulis(pipefds[1],pin, 5); // tulis PIN ke pipa

printf ('Membuat PIN pada anak dan mengirim ke orang tua... ');
tidur(2); // penundaan yang disengaja
keluar (EXIT_SUCCESS);
}

jika(pid> 0) { // dalam proses utama
tunggu(BATAL); // tunggu proses anak selesai
Menutup(pipefds[1]); // tutup tulis fd
Baca(pipefds[0],penyangga, 5); // baca PIN dari pipa
Menutup(pipefds[0]); // tutup baca fd

printf ('Orang tua menerima PIN '%s' ',penyangga);
}

kembaliEXIT_SUCCESS;
}

Dalam contoh ini, saya menunjukkan kepada Anda bagaimana menggunakan pipa untuk komunikasi antar-proses. Saya telah mengirim PIN dari proses anak ke proses induk menggunakan pipa. Kemudian baca PIN dari pipa di proses induk dan cetak dari proses induk.

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

pid_t pid=garpu();

Kemudian, dalam proses anak ( pid == 0 ), saya menulis PIN ke pipa menggunakan menulis() fungsi.

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

Setelah PIN ditulis ke pipa dari proses anak, proses induk ( pid > 0 ) membacanya dari pipa menggunakan Baca() fungsi.

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

Kemudian, proses induk mencetak PIN menggunakan cetakf() berfungsi seperti biasa.

printf ('Orang tua menerima PIN '%s' ',penyangga);

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

Contoh 4:

Buat file sumber C baru 4_pipe.c sebagai ketik di baris kode berikut.

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk

#tentukan PIN_LENGTH 4
#tentukan PIN_WAIT_INTERVAL 2

ruang kosongdapatkanPIN(arangpin[PIN_LENGTH+ 1]) {
srand (getpid() +getppid());

pin[0] = 49 + baris () % 7;

untuk(ke dalamSaya= 1;Saya<PIN_LENGTH;Saya++) {
pin[Saya] = 48 + baris () % 7;
}

pin[PIN_LENGTH] = ' 0';
}


ke dalamutama(ruang kosong) {
ketika(1) {
ke dalampipefds[2];
arangpin[PIN_LENGTH+ 1];
arangpenyangga[PIN_LENGTH+ 1];

pipa(pipefds);

pid_t pid=garpu();

jika(pid== 0) {
dapatkanPIN(pin); // buat PIN
Menutup(pipefds[0]); // tutup baca fd
menulis(pipefds[1],pin,PIN_LENGTH+ 1); // tulis PIN ke pipa

printf ('Membuat PIN pada anak dan mengirim ke orang tua... ');

tidur(PIN_WAIT_INTERVAL); // menunda pembuatan PIN dengan sengaja.

keluar (EXIT_SUCCESS);
}

jika(pid> 0) {
tunggu(BATAL); // menunggu anak selesai

Menutup(pipefds[1]); // tutup tulis fd
Baca(pipefds[0],penyangga,PIN_LENGTH+ 1); // baca PIN dari pipa
Menutup(pipefds[0]); // tutup baca fd
printf ('Orang tua menerima PIN '%s' dari anak. ',penyangga);
}
}

kembaliEXIT_SUCCESS;
}

Contoh ini sama dengan Contoh 3 . Satu-satunya perbedaan adalah bahwa program ini terus menerus membuat proses anak, menghasilkan PIN dalam proses anak dan mengirimkan PIN ke proses induk menggunakan pipa.

Proses induk kemudian membaca PIN dari pipa dan mencetaknya.

Program ini menghasilkan PIN PIN_LENGTH baru setiap PIN_WAIT_INTERVAL detik.

Seperti yang Anda lihat, program bekerja seperti yang diharapkan.

Anda hanya dapat menghentikan program dengan menekan + C .

Jadi, inilah cara Anda menggunakan panggilan sistem pipe() dalam bahasa pemrograman C. Terima kasih telah membaca artikel ini.