C 語言程式演示 fork() 和 pipe()


在本問題中,我們將演示 fork() 和 pipe()。這裡我們將建立一個用於 Linux 的 C 程式,使用 2 個程序,一個程序獲取輸入並將其傳送給另一個程序,另一個程序將字串與預定義字串連線並返回連線後的字串。

首先讓我們回顧一下 fork() 和 pipe()

fork() - 它建立一個子程序,這個子程序有一個新的 PID 和 PPID。

pipe() 是一個 Unix、Linux 系統呼叫,用於程序間通訊。

讓我們舉一個例子來理解這個問題,

輸入

Learn programming
Predefined string: at tutorialspoint

輸出

Learn programming at tutorialspoint

解釋

P1 take input of string “learn programming”

透過管道傳送到 P2。

P2 連線字串並將其傳送回 p1,p1 列印它。

在程式中,我們將使用 fork() 函式建立兩個程序,稱為 P1 和 P2。它有以下三個返回值,顯示程式的狀態。

返回值 < 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
", 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

更新於: 2020-07-17

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.