您的位置:首页 > 其它

使用管道实现两个进程之间的通信

2016-06-28 20:41 681 查看
今天学到管道的使用,感觉挺简单的,自己实际写了下,深陷逻辑中不能自拔。

现有进程a和进程b,管道单向传输数据,两个进程链接两个管道实现初级同步。

一个进程打开管道的读,另一个进程就打开管道的写。

进程a:

int fdr=open("1",O_RDONLY);
if(-1 == fdr)
{
perror("open dr");
return -1;
}
int fdw=open("2",O_WRONLY);
if(-1 == fdw)
{
perror("open dw");
return -1;
}


进程b:

int fdw=open("1",O_WRONLY);
if(-1 == fdw)
{
perror("open dw");
return -1;
}
int fdr=open("2",O_RDONLY);
if(-1 == fdr)
{
perror("open dr");
return -1;
}


注意进程中打开管道的顺序必须是成对的,即是对于同一个管道,a进程是写

操作,b进程在和a同样的执行顺序下执行读操作。不然就会循环等待,接受不

到对方的信息。

为了实现双方的实时通信,需要使用 I/O多路转接模型,使用select函数,使用的头文件

sys/types.h sys/time.h unistd.h

函数的原型是 int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds

,struct timeval *timeout)

进程a:

fd_set set;
while(1)
{
FD_ZERO(&set);
FD_SET(fdr,&set);
FD_SET(0,&set);
memset(buff,0,sizeof(buff));
int ret=select(fdr+1,&set,NULL,NULL,NULL);
if(FD_ISSET(fdr,&set))
{
read(fdr,buff,sizeof(buff));
puts(buff);
}

if(FD_ISSET(0,&set))
{
read(0,buff,sizeof(buff));
//  scanf("%s",buff);
write(fdw,buff,strlen(buff)-1);
}
}
close(fdr);
close(fdw);


进程b:

fd_set set;
while(1)
{
FD_ZERO(&set);
FD_SET(fdr,&set);
FD_SET(0,&set);
memset(buff,0,sizeof(buff));
int ret=select(fdr+1,&set,NULL,NULL,NULL);
if(FD_ISSET(0,&set))
{
read(0,buff,sizeof(buff));
//  scanf("%s",buff);
write(fdw,buff,strlen(buff)-1);
}
if(FD_ISSET(fdr,&set))
{
read(fdr,buff,sizeof(buff));
puts(buff);
}
}
close(fdr);
close(fdw);


**此处小心**fd_set是文件控制符的集合,需要自己创建。最后在这个实例中,实现进程的通信,

需要监听writre,即时标准输入stdin(STDIN_FILENO)。

本人知识有限,不足之处还请指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ubuntu 通信