Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

โปรแกรม C เพื่อแสดง fork() และ pipe()


ในปัญหานี้ เราจะสาธิต fork() และ pipe() ที่นี่เราจะสร้างโปรแกรม C สำหรับ Linux ที่จะเชื่อมสองสตริง โดยใช้ 2 กระบวนการที่หนึ่งจะรับอินพุตและส่งไปยังผู้อื่นซึ่งจะเชื่อมสตริงกับสตริงที่กำหนดไว้ล่วงหน้าและส่งคืนสตริงที่ต่อกัน

ก่อนอื่นให้ recap fork() และ pipe()

ส้อม() − มันสร้างกระบวนการลูก กระบวนการลูกนี้เป็น PID และ PPID ใหม่

ท่อ() เป็นการเรียกระบบ Unix หรือ Linux ที่ใช้สำหรับการสื่อสารระหว่างกระบวนการ

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

อินพุต

Learn programming
Predefined string: at tutorialspoint

ผลลัพธ์

Learn programming at tutorialspoint

คำอธิบาย

P1 take input of string “learn programming”

ส่งไปที่ P2 โดยใช้ไปป์

P2 เชื่อมสตริงและส่งกลับไปที่ p1 ซึ่งพิมพ์ออกมา

ในโปรแกรม เราจะสร้างสองกระบวนการ คือ P1 และ P2 โดยใช้ฟังก์ชัน fork() มีค่าส่งคืนสามค่าต่อไปนี้ซึ่งแสดงสถานะของโปรแกรม

คืนค่า <0 การสร้างกระบวนการล้มเหลว

คืนค่า =0, กระบวนการลูก

ส่งคืนค่า> 0 ซึ่งจะเป็น ID กระบวนการของกระบวนการลูกไปยังกระบวนการหลัก เช่น กระบวนการหลักจะถูกดำเนินการ

เราจะสร้างสองไพพ์หนึ่งอันสำหรับการสื่อสารจาก P1 ถึง P2 และอีกอันจาก P2 ถึง P1 เนื่องจากไพพ์เป็นทางเดียว

โปรแกรม C สาธิต fork() และ pipe()

ตัวอย่าง

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.h>
int main(){
   int p12[2];
   int p21[2];
   char fixed_str[] = " at tutorialspoint";
   char input_str[100];
   pid_t P;
   if (pipe(p12)==-1 || pipe(p21)==-1 ){
      fprintf(stderr, "Filed to create pipe" );
      return 1;
   }
   scanf("%s", input_str);
   P = fork();
   if (P < 0){
      fprintf(stderr, "fork Failed" );
      return 1;
   }
   else if (P > 0){
      char concat_str[100];
      close(p12[0]);
      write(p12[1], input_str, strlen(input_str)+1);
      close(p12[1]);
      wait(NULL);
      close(p21[1]);
      read(p21[0], concat_str, 100);
      printf("Concatenated string %s\n", concat_str);
      close(p21[0]);
   }
   else{
      close(p12[1]);
      char concat_str[100];
      read(p12[0], concat_str, 100);
      int k = strlen(concat_str);
      int i;
      for (i=0; i<strlen(fixed_str); i++)
      concat_str[k++] = fixed_str[i];
      concat_str[k] = '\0';
      close(p12[0]);
      close(p21[0]);
      write(p21[1], concat_str, strlen(concat_str)+1);
      close(p21[1]);
      exit(0);
   }
}

ผลลัพธ์

Concatenated string Learn at tutorialspoint