Computer >> Máy Tính >  >> Lập trình >> lập trình C

Chương trình C để chứng minh fork () và pipe ()

Trong bài toán này, chúng tôi sẽ chứng minh fork () và pipe (). Ở đây, chúng tôi sẽ tạo một chương trình C cho Linux sẽ nối hai chuỗi, sử dụng 2 quy trình, một quy trình sẽ nhận đầu vào và gửi cho người khác sẽ nối chuỗi với một chuỗi được xác định trước và trả về chuỗi đã nối.

Đầu tiên hãy cho phép recap fork () và pipe ()

ngã ba () - nó tạo ra một quy trình con, quy trình con này là một PID và PPID mới.

ống () là một lệnh gọi hệ thống Unix, Linux được sử dụng để giao tiếp giữa các quá trình.

Hãy lấy một ví dụ để hiểu vấn đề,

Đầu vào

Learn programming
Predefined string: at tutorialspoint

Đầu ra

Learn programming at tutorialspoint

Giải thích

P1 take input of string “learn programming”

Gửi nó đến P2 bằng cách sử dụng đường dẫn.

P2 nối các chuỗi và gửi trở lại p1 để in ra.

Trong chương trình, chúng ta sẽ tạo hai tiến trình, chẳng hạn P1 và P2 bằng cách sử dụng hàm fork (). Nó có ba giá trị trả về sau đây hiển thị trạng thái của chương trình.

trả về giá trị <0, quá trình tạo không thành công.

trả về giá trị =0, quy trình con.

trả về giá trị> 0, đây sẽ là ID tiến trình của tiến trình con đối với tiến trình mẹ, tức là tiến trình mẹ sẽ được thực thi.

Chúng tôi sẽ tạo hai đường ống một để giao tiếp từ P1 đến P2 và một đường khác từ P2 đến P1 vì đường dẫn là một chiều.

Chương trình C để chứng minh fork () và pipe ()

Ví dụ

#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);
   }
}

Đầu ra

Concatenated string Learn at tutorialspoint