Pemrograman C

Panggilan Sistem Pipa di C

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

Semua Tentang pipa() Fungsi:

Sintaks dari pipa() fungsinya adalah:

int pipa(int pipefd[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:

$man 2 pipa
Halaman manual pipa().

Contoh 1:

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

#termasuk
#termasuk
#termasuk
 
int utama(kosong)
int pipefds[2];
 
if(pipa(pipefds) == -1)
perror("pipa");
keluar(EXIT_FAILURE);

 
printf("Baca Nilai Deskriptor File: %d\n", pipefds[0]);
printf("Tulis Nilai Deskriptor File: %d\n", pipefds[1]);
 
kembali EXIT_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:.

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

if(pipa(pipefds) == -1)
perror("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\n", pipefds[0]);
printf("Tulis Nilai Deskriptor File: %d\n", pipefds[1]);

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

Contoh 2:

Buat file sumber C lain 2_pipa.c dan ketikkan baris kode berikut.

#termasuk
#termasuk
#termasuk
#termasuk
 
int utama(kosong)
int pipefds[2];
penyangga karakter[5];
 
if(pipa(pipefds) == -1)
perror("pipa");
keluar(EXIT_FAILURE);

 
char *pin = "4128\0";
 
printf("Menulis PIN ke pipa... \n");
tulis(pipefds[1], pin, 5);
printf("Selesai.\n\n");
 
printf("Membaca PIN dari pipa... \n");
baca(pipefds[0], buffer, 5);
printf("Selesai.\n\n");
 
printf("PIN dari pipa: %s\n", buffer);
 
kembali EXIT_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 \0).

char *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.

tulis(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.

penyangga karakter[5];

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

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

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

printf("PIN dari pipa: %s\n", buffer);

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

Contoh 3:

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

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
int utama(kosong)
int pipefds[2];
karakter * pin;
penyangga karakter[5];
 
if(pipa(pipefds) == -1)
perror("pipa");
keluar(EXIT_FAILURE);

 
pid_t pid = garpu();
 
if(pid == 0) // dalam proses anak
pin = "4821\0"; // PIN untuk dikirim
tutup(pipefds[0]); // tutup baca fd
tulis(pipefds[1], pin, 5); // tulis PIN ke pipa
 
printf("Membuat PIN pada anak dan mengirim ke orang tua... \n");
tidur (2); // penundaan yang disengaja
keluar(EXIT_SUCCESS);

 
if(pid > 0) // dalam proses utama
tunggu (NULL); // tunggu proses anak selesai
tutup(pipefds[1]); // tutup tulis fd
baca(pipefds[0], buffer, 5); // baca PIN dari pipa
tutup(pipefds[0]); // tutup baca fd
 
printf("Induk menerima PIN '%s'\n", buffer);

 
kembali EXIT_SUCCESS;

Dalam contoh ini, saya menunjukkan cara 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.

tulis(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], buffer, 5);

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

printf("Induk menerima PIN '%s'\n", buffer);

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

Contoh 4:

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

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
 
#tentukan PIN_LENGTH 4
#tentukan PIN_WAIT_INTERVAL 2
 
void getPIN(char pin[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(kosong)
sementara(1)
int pipefds[2];
pin karakter[PIN_LENGTH + 1];
char buffer[PIN_LENGTH + 1];
 
pipa(pipefds);
 
pid_t pid = garpu();
 
jika(pid == 0)
dapatkan PIN(pin); // buat PIN
tutup(pipefds[0]); // tutup baca fd
tulis(pipefds[1], pin, PIN_LENGTH + 1); // tulis PIN ke pipa
 
printf("Membuat PIN pada anak dan mengirim ke orang tua... \n");
 
tidur(PIN_WAIT_INTERVAL); // menunda pembuatan PIN dengan sengaja.
 
keluar(EXIT_SUCCESS);

 
jika(pid > 0)
tunggu (NULL); // menunggu anak selesai
 
tutup(pipefds[1]); // tutup tulis fd
baca(pipefds[0], buffer, PIN_LENGTH + 1); // baca PIN dari pipa
tutup(pipefds[0]); // tutup baca fd
printf("Orang tua menerima PIN '%s' dari anak.\n\n", penyangga);


 
kembali EXIT_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 ini bekerja seperti yang diharapkan.

Anda hanya dapat menghentikan program dengan menekan + C.

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

Port Sumber Terbuka dari Mesin Game Komersial
Rekreasi mesin game gratis, open source, dan lintas platform dapat digunakan untuk bermain lama serta beberapa judul game yang cukup baru. Artikel ini...
Game Baris Perintah Terbaik untuk Linux
Baris perintah bukan hanya sekutu terbesar Anda saat menggunakan Linux-ini juga dapat menjadi sumber hiburan karena Anda dapat menggunakannya untuk me...
Aplikasi Pemetaan Gamepad Terbaik untuk Linux
Jika Anda suka bermain game di Linux dengan gamepad alih-alih sistem input keyboard dan mouse biasa, ada beberapa aplikasi yang berguna untuk Anda. Ba...