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
广告