进程间通信之:实验内容
扫描二维码
随时随地手机看文章
通过编写有名管道多路通信实验,读者可进一步掌握管道的创建、读写等操作,同时,也复习使用select()函数实现管道的通信。
2.实验内容读者还记得在6.3.3小节中,通过mknod命令创建两个管道的实例吗?本实例只是在它的基础上添加有名管道的创建,而不用再输入mknod命令。
3.实验步骤(1)画出流程图。
该实验流程图如图8.9所示。
图8.98.6.1实验流程图
(2)编写代码。
该实验源代码如下所示。
/*pipe_select.c*/
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<errno.h>
#defineFIFO1"in1"
#defineFIFO2"in2"
#defineMAX_BUFFER_SIZE1024/*缓冲区大小*/
#defineIN_FILES3/*多路复用输入文件数目*/
#defineTIME_DELAY60/*超时值秒数*/
#defineMAX(a,b)((a>b)?(a):(b))
intmain(void)
{
intfds[IN_FILES];
charbuf[MAX_BUFFER_SIZE];
inti,res,real_read,maxfd;
structtimevaltv;
fd_setinset,tmp_inset;
fds[0]=0;
/*创建两个有名管道*/
if(access(FIFO1,F_OK)==-1)
{
if((mkfifo(FIFO1,0666)<0)&&(errno!=EEXIST))
{
printf("Cannotcreatefifofilen");
exit(1);
}
}
if(access(FIFO2,F_OK)==-1)
{
if((mkfifo(FIFO2,0666)<0)&&(errno!=EEXIST))
{
printf("Cannotcreatefifofilen");
exit(1);
}
}
/*以只读非阻塞方式打开两个管道文件*/
if((fds[1]=open(FIFO1,O_RDONLY|O_NONBLOCK))<0)
{
printf("Openin1errorn");
return1;
}
if((fds[2]=open(FIFO2,O_RDONLY|O_NONBLOCK))<0)
{
printf("Openin2errorn");
return1;
}
/*取出两个文件描述符中的较大者*/
maxfd=MAX(MAX(fds[0],fds[1]),fds[2]);
/*初始化读集合inset,并在读文件描述符集合中加入相应的描述集*/
FD_ZERO(&inset);
for(i=0;i<IN_FILES;i++)
{
FD_SET(fds[i],&inset);
}
FD_SET(0,&inset);
tv.tv_sec=TIME_DELAY;
tv.tv_usec=0;
/*循环测试该文件描述符是否准备就绪,并调用select()函数对相关文件描述符做相应操作*/
while(FD_ISSET(fds[0],&inset)
||FD_ISSET(fds[1],&inset)||FD_ISSET(fds[2],&inset))
{
/*文件描述符集合的备份,免得每次进行初始化*/
tmp_inset=inset;
res=select(maxfd+1,&tmp_inset,NULL,NULL,&tv);
switch(res)
{
case-1:
{
printf("Selecterrorn");
return1;
}
break;
case0:/*Timeout*/
{
printf("Timeoutn");
return1;
}
break;
default:
{
for(i=0;i<IN_FILES;i++)
{
if(FD_ISSET(fds[i],&tmp_inset))
{
memset(buf,0,MAX_BUFFER_SIZE);
real_read=read(fds[i],buf,MAX_BUFFER_SIZE);
if(real_read<0)
{
if(errno!=EAGAIN)
{
return1;
}
}
elseif(!real_read)
{
close(fds[i]);
FD_CLR(fds[i],&inset);
}
else
{
if(i==0)
{/*主程序终端控制*/
if((buf[0]=='q')||(buf[0]=='Q'))
{
return1;
}
}
else
{/*显示管道输入字符串*/
buf[real_read]='