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
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP