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+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告