目录
题目
父子进程实现通信,父进程循环从终端输入数据,子进程循环打印数据,当输入quit结束。提示:不需要加同步机制, 因为pipe无数据时读会阻塞。
先创建管道再fork,这样父子进程可以使用同一个无名管道。
思路
首先创建了一个管道,通过
pipe
函数获取了管道的读端和写端文件描述符fd[0]
和fd[1]
。如果管道创建失败,会输出错误并退出。利用
fork
函数创建子进程。在子进程中:
- 不断从管道的读端读取数据到
buf
中。- 每次读取后,将读取到的数据与
"quit"
进行比较,如果相同就退出循环。- 如果不同,将读取到的数据打印出来。
在父进程中:
- 不断从标准输入获取用户输入的数据存储到
buf
中。- 将输入的数据写入管道。
- 每次输入后,将输入的数据与
"quit"
进行比较,如果相同就退出循环。- 使用
wait(NULL)
等待子进程结束。总体来说,这段代码实现了父子进程通过管道进行通信,父进程向管道写入数据,子进程从管道读取数据并处理,当输入特定字符串
"quit"
时,子进程和父进程都会退出相应的循环。
代码
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char const *argv[])
{
pid_t pid;
char buf[32] = "";
int fd[2];
if (pipe(fd) < 0)
{
perror("pipe err");
return -1;
}
printf("%d %d\n", fd[0], fd[1]);
pid = fork();
if (pid < 0)
{
perror("fork err");
return -1;
}
else if (pid == 0) //循环打印, quit结束
{
while (1)
{
read(fd[0], buf, 32); //读出管道中内容存入buf
if (strcmp(buf, "quit") == 0)
break;
printf("%s\n", buf);//将buf内容打印到终端
}
}
else //循环输入,quit结束
{
while (1)
{
scanf("%s", buf);
write(fd[1], buf, 32); //把输入buf内容写入管道
if (strcmp(buf, "quit") == 0)
break;
}
wait(NULL);
}
return 0;
}