Semua Tentang pipa() Fungsi:

Semua Tentang pipa() Fungsi:

Sintaks dari pipe() fungsinya adalah:

int pipe(int pipefd[2]);

Di sini, fungsi pipe() membuat saluran data searah untuk komunikasi antar-proses. Anda lulus dalamint (Bilangan bulat) jenis array pipefdterdiri dari 2 elemen array ke fungsi pipe(). Kemudian fungsi pipe() membuat dua deskriptor file dipipefd 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 error 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 headerunistd.h sebagai berikut:

#include <unistd.h>

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

$ man 2 pipe
man page of pipe().

Contoh 1:

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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(void) {
  int pipefds[2];
 
  if(pipe(pipefds) == -1) {
    perror("pipe");
    exit(EXIT_FAILURE);
  }
 
  printf("Read File Descriptor Value: %dn", pipefds[0]);
  printf("Write File Descriptor Value: %dn", pipefds[1]);
 
  return EXIT_SUCCESS;
}

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

#include <unistd.h>

Kemudian, di main() 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.

pipe(pipefds)

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

if(pipe(pipefds) == -1) {
  perror("pipe");
  exit(EXIT_FAILURE);
}

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

printf("Read File Descriptor Value: %dn", pipefds[0]);
printf("Write File Descriptor Value: %dn", pipefds[1]);

Jika Anda menjalankan program, Anda akan melihat output berikut. Seperti yang Anda lihat, nilai deskriptor file pipa bacapipefds[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.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
 
int main(void) {
  int pipefds[2];
  char buffer[5];
 
  if(pipe(pipefds) == -1) {
    perror("pipe");
    exit(EXIT_FAILURE);
  }
 
  char *pin = "4128 ";
 
  printf("Writing PIN to pipe...n");
  write(pipefds[1], pin, 5);
  printf("Done.nn");
 
  printf("Reading PIN from pipe...n");
  read(pipefds[0], buffer, 5);
  printf("Done.nn");
 
  printf("PIN from pipe: %sn", buffer);
 
  return EXIT_SUCCESS;
}

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

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

char *pin = "4128 ";

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 menggunakanwrite()fungsi menggunakan deskriptor file pipa tulispipefds[1] sebagai berikut.

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

Sekarang saya memiliki beberapa data di dalam pipa, saya dapat membacanya dari pipa menggunakanread()berfungsi pada deskriptor file pipa bacapipefds[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 dibuffersusunan karakter. Karena saya akan membaca 5 byte data dari pipa,bufferarray karakter harus memiliki panjang minimal 5 byte.

Saya telah mendefinisikanbufferarray karakter di awalmain()fungsi.

char buffer[5];

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

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

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

printf("PIN from pipe: %sn", buffer);

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.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void) {
  int pipefds[2];
  char *pin;
  char buffer[5];
 
  if(pipe(pipefds) == -1) {
    perror("pipe");
    exit(EXIT_FAILURE);
  }
 
  pid_t pid = fork();
 
  if(pid == 0) { // in child process
    pin = "4821 "; // PIN to send
    close(pipefds[0]); // close read fd
    write(pipefds[1], pin, 5); // write PIN to pipe
 
    printf("Generati ng PIN in child and sending to parent...n");
    sleep(2); // intentional delay
    exit(EXIT_SUCCESS);
  }
 
  if(pid > 0) { // in main process
    wait(NULL); // wait for child process to finish
    close(pipefds[1]); // close write fd
    read(pipefds[0], buffer, 5); // read PIN from pipe
    close(pipefds[0]); // close read fd
 
    printf("Parent received PIN '%s'n", buffer);
  }
 
  return EXIT_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 = fork();

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

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

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

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

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

printf("Parent received PIN '%s'n", buffer);

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.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
 
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
 
void getPIN(char pin[PIN_LENGTH + 1]) {
  srand(getpid() + getppid());
 
  pin[0] = 49 + rand() % 7;
 
  for(int i = 1; i < PIN_LENGTH; i++) {
    pin[i] = 48 + rand() % 7;
  }
 
  pin[PIN_LENGTH] = ' ';
}
 
 
int main(void) {
  while(1) {
    int pipefds[2];
    char pin[PIN_LENGTH + 1];
    char buffer[PIN_LENGTH + 1];
 
    pipe(pipefds);
 
    pid_t pid = fork();
 
    if(pid == 0) {
      getPIN(pin); // generate PIN
      close(pipefds[0]); // close read fd
      write(pipefds[1], pin, PIN_LENGTH + 1); // write PIN to pipe
 
      printf("Generating PIN in child and sending to parent...n");
 
      sleep(PIN_WAIT_INTERVAL); // delaying PIN generation intentionally.
 
      exit(EXIT_SUCCESS);
    }
 
    if(pid > 0) {
      wait(NULL); // waiting for child to finish
 
      close(pipefds[1]); // close write fd
      read(pipefds[0], buffer, PIN_LENGTH + 1); // read PIN from pipe
      close(pipefds[0]); // close read fd
      printf("Parent received PIN '%s' from child.nn", buffer);
    }
  }
 
  return EXIT_SUCCESS;
}

Contoh ini sama dengan Example 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 <Ctrl> + C.

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

Related Posts