Pengaturcaraan C

Panggilan Sistem Paip di C

Panggilan Sistem Paip di 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. Oleh itu, mari kita mulakan.

Fungsi Semua Tentang paip ():

Sintaks bagi paip () fungsi adalah:

paip int (int pipefd [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.

Setelah berjaya, fungsi paip () mengembalikan 0. Sekiranya ralat berlaku semasa inisialisasi paip, maka fungsi paip () kembali -1.

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

#sertakan

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

$ man 2 paip
Halaman man paip ().

Contoh 1:

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

#sertakan
#sertakan
#sertakan
 
int utama (tidak sah)
int pipefds [2];
 
jika (paip (pipefds) == -1)
kesalahan ("paip");
jalan keluar (EXIT_FAILURE);

 
printf ("Baca Nilai Deskriptor Fail:% d \ n", pipefds [0]);
printf ("Tulis Nilai Deskriptor Fail:% d \ n", pipefds [1]);
 
pulangkan EXIT_SUCCESS;

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

#sertakan

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

int pipefds [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.

jika (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 Nilai Deskriptor Fail:% d \ n", pipefds [0]);
printf ("Tulis Nilai Deskriptor Fail:% 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
 
int utama (tidak sah)
int pipefds [2];
penampan char [5];
 
jika (paip (pipefds) == -1)
kesalahan ("paip");
jalan keluar (EXIT_FAILURE);

 
char * pin = "4128 \ 0";
 
printf ("Menulis PIN ke paip ... \ n");
tulis (pipefds [1], pin, 5);
printf ("Selesai.\ n \ n ");
 
printf ("Membaca PIN dari paip… \ n");
baca (pipefds [0], penyangga, 5);
printf ("Selesai.\ n \ n ");
 
printf ("PIN dari paip:% s \ n", penyangga);
 
pulangkan EXIT_SUCCESS;

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 * pin = "4128 \ 0";

Setiap watak ASCII berukuran 1 bait dalam C. Jadi, untuk menghantar PIN 4 digit melalui paip, anda mesti menulis 5 bait (4 + 1 NULL watak) 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.

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

Sekarang saya mempunyai beberapa data di dalam paip, saya dapat membacanya dari paip menggunakan baca () berfungsi pada deskriptor fail paip baca pipefds [0]. Seperti yang telah saya tuliskan 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 mesti sekurang-kurangnya 5 bait.

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

penampan char [5];

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

baca (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
int utama (tidak sah)
int pipefds [2];
pin * pin;
penampan char [5];
 
jika (paip (pipefds) == -1)
kesalahan ("paip");
jalan keluar (EXIT_FAILURE);

 
pid_t pid = garpu ();
 
jika (pid == 0) // dalam proses anak
pin = "4821 \ 0"; // PIN untuk dihantar
tutup (pipefds [0]); // tutup baca fd
tulis (pipefds [1], pin, 5); // tulis PIN ke paip
 
printf ("Menjana PIN pada anak dan menghantar kepada ibu bapa… \ n");
tidur (2); // kelewatan yang disengajakan
jalan keluar (EXIT_SUCCESS);

 
jika (pid> 0) // dalam proses utama
tunggu (NULL); // tunggu proses anak selesai
tutup (pipefds [1]); // tutup tulis fd
baca (pipefds [0], penyangga, 5); // baca PIN dari paip
tutup (pipefds [0]); // tutup baca fd
 
printf ("Orang tua menerima PIN '% s' \ n", penyangga);

 
pulangkan EXIT_SUCCESS;

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 kanak-kanak menggunakan fungsi garpu ().

pid_t pid = garpu ();

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

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

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

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

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

printf ("Orang tua 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
 
batal getPIN (pin char [PIN_LENGTH + 1])
srand (getpid () + getppid ());
 
pin [0] = 49 + rand ()% 7;
 
untuk (int i = 1; i < PIN_LENGTH; i++)
pin [i] = 48 + rand ()% 7;

 
pin [PIN_LENGTH] = '\ 0';

 
 
int utama (tidak sah)
semasa (1)
int pipefds [2];
pin char [PIN_LENGTH + 1];
penampan char [PIN_LENGTH + 1];
 
paip (pipefds);
 
pid_t pid = garpu ();
 
jika (pid == 0)
getPIN (pin); // jana PIN
tutup (pipefds [0]); // tutup baca fd
tulis (pipefds [1], pin, 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 (EXIT_SUCCESS);

 
jika (pid> 0)
tunggu (NULL); // menunggu anak selesai
 
tutup (pipefds [1]); // tutup tulis fd
baca (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);


 
pulangkan EXIT_SUCCESS;

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.

SuperTuxKart untuk Linux
SuperTuxKart adalah tajuk hebat yang direka untuk membawa anda pengalaman Mario Kart secara percuma pada sistem Linux anda. Ia cukup mencabar dan meny...
Tutorial Battle for Wesnoth
The Battle for Wesnoth adalah salah satu permainan strategi sumber terbuka paling popular yang boleh anda mainkan pada masa ini. Bukan hanya permainan...
0 A.D. Tutorial
Daripada banyak permainan strategi di luar sana, 0 A.D. berjaya menonjol sebagai tajuk yang komprehensif dan permainan taktikal yang sangat mendalam w...