更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。
本篇记录应用无名管道PIPE,进行父子双进程的“双向通信”,并当某一方收到/发送“quit”马上结束通信,具体代码如下:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
int status;
char buf[50]; //read/write用于存放字符串
int fd1[2]; //用于存放管道1的两个文件描述符
int fd2[2]; //用于存放管道2的两个文件描述符
if(pipe(fd1) == -1) //创建管道1,并将文件描述符放进fd1[2]中
{
perror("pipe()");
exit(1);
}
if(pipe(fd2) == -1) //创建管道2,并将文件描述符放进fd2[2]中
{
perror("pipe()");
exit(1);
}
pid_t id = fork(); //创建一个子进程
if(id > 0) //父进程
{
while(1)
{
bzero(buf,50);
read(fd1[0],buf,50); //父进程从管道1读取信息
if(strcmp(buf,"quit") == 0)
{
write(fd2[1],buf,50); //父进程从管道2写入信息
break;
}
printf("父进程:我收到:%s\n\n",buf);
bzero(buf,50);
printf("回复子进程:");
scanf("%s",buf);
write(fd2[1],buf,50); //父进程从管道2写入信息
}
}
else if(id == 0) //子进程
{
while(1)
{
bzero(buf,50);
printf("发给父进程:");
scanf("%s",buf);
write(fd1[1],buf,50); //子进程从管道1写入信息
bzero(buf,50);
read(fd2[0],buf,50); //子进程从管道2读取信息
if(strcmp(buf,"quit") == 0)
{
write(fd1[1],buf,50); //子进程从管道1写入信息
break;
}
printf("子进程:我收到:%s\n\n",buf);
}
exit(0); //退出子进程
}
pid_t otherid=waitpid(id,&status,0);//阻塞等待
close(fd1[0]);
close(fd1[1]);
close(fd2[0]);
close(fd2[1]);
}
运行结果: