今天学到管道的使用,感觉挺简单的,自己实际写了下,深陷逻辑中不能自拔。
现有进程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)。
本人知识有限,不足之处还请指出。