知识点:
1.管道是在进程和进程间搭建通道;管道是半双工的,数据只能向一个方向流动,因此,需要双方通信的时候,需要建立两个管道,管道建立要在创建进程前,否则容易出现管道破坏的问题
2.管道分为匿名管道和命名管道;
1)匿名管道:只能用于父子进程或者兄弟进程(同一个爹)之间进行通信
2)命名管道:利用FIFO文件,可以用于没有任何亲缘关系的进程;FIFO文件并非真正的文件,它并不会保留数据,也就是进程之间传输的数据不会保留在文件内部。(注意:两端都要open这个文件才可以)
上代码
准备好两个项目(两端都是可以读和写,但是是回合制的)
进程1
进程2
int main()
{
int readfd = 0;
int writefd = 0;
char buf[50] = { 0 };
umask(0);
//读的管道
if (access("/root/projects/a2b.fifo", F_OK) == -1|| access("/root/projects/b2a.fifo", F_OK) == -1)
{
if (mkfifo("/root/projects/a2b.fifo", 0777) == -1)
{
perror("mkfifo a2b perror");
}
if (mkfifo("/root/projects/b2a.fifo", 0777) == -1)
{
perror("mkfifo b2a perror");
}
}
else
{
cout << "文件存在" << endl;
readfd = open("/root/projects/a2b.fifo", O_RDONLY);
writefd = open("/root/projects/b2a.fifo", O_WRONLY);
while (1)
{
int res1 = read(readfd, buf, sizeof(buf));
cout << "res1=" << res1 << " buf: " << buf << endl;
bzero(buf,sizeof(buf));
cout << "请输入" << endl;
fgets(buf, sizeof(buf), stdin);
int res2 = write(writefd, buf, sizeof(buf));
bzero(buf, sizeof(buf));
}
}
return 0;
}
附上运行结果,我是在ubuntu上运行的