在此问题中,我们将演示fork()
和pipe()
。在这里,我们将为Linux创建一个C程序,该程序将连接两个字符串,使用2个进程,其中一个将接受输入并将其发送给其他进程,这些进程将字符串与预定义的字符串连接起来并返回连接的字符串。
首先让概括fork()
和pipe()
fork() -它创建一个子进程,该子进程具有新的PID和PPID。
pipe()是Unix,Linux系统调用,用于进程间通信。
让我们以一个例子来理解问题,
Learn programming Predefined string: at nhooo
输出结果
Learn programming at nhooo
P1 take input of string “learn programming”
使用管道将其发送到P2。
P2连接字符串并将其发送回给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 nhooo"; 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 nhooo