实现过程:
//要求实现父子进程对话
//父进程先发送一句话给子进程,子进程接收后打印
//子进程再回复一句话给父进程,父进程接收后打印
//重复1.2步骤,当收到quit后,要结束父子进程
#include<stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char str[128]=""; //用于存储读取内容
char quit[128]="告辞!"; //用于判断退出语句
int pfd[2]={0}; //打开一个无名管道文件
if(pipe(pfd)<0)
{
perror("pipe");
return -1;
}
while(1)
{
//循环创建子进程
pid_t pid=fork();
if(pid>0) //父进程执行
{
printf("父说>>>");
fgets(str,sizeof(str),stdin); //从终端获取内容
str[strlen(str)-1]='\0'; //将终端读取的\n换位\0;
if(0==strcmp(str,quit)) //如果与退出语句一直,结束程序
{
return 0;
}
write(pfd[1],str,sizeof(str)); //将内容写入管道文件
wait(NULL); //阻塞等待子进程退出
read(pfd[0],str,sizeof(str)); //读取写入管道文件用于判断子进程中的输出内容
write(pfd[1],str,sizeof(str));
if(0==strcmp(str,quit))
{
return 0;
}
printf("父打印>>>");
read(pfd[0],str,sizeof(str)); //读取管道文件,打印到终端
fputs(str,stdout);
printf("\n");
}
//子进程执行
if(0==pid)
{
printf("子打印>>>"); //打印管道文件内的内容
read(pfd[0],str,sizeof(str));
fputs(str,stdout);
printf("\n");
printf("子说>>>"); //从终端获取内容
fgets(str,sizeof(str),stdin);
str[strlen(str)-1]='\0';
write(pfd[1],str,sizeof(str)); //写入管道文件
exit(1); //退出程序
}
}
return 0;
}
实现效果: