新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 进程间通信之:实验内容

进程间通信之:实验内容

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257122.htm

8.7内容

8.7.1

1.目的

通过编写有名管道多路通信实验,读者可进一步掌握管道的创建、读写等操作,同时,也复习使用select()函数实现管道的通信。

2.实验内容

读者还记得在6.3.3小节中,通过mknod命令创建两个管道的实例吗?本实例只是在它的基础上添加有名管道的创建,而不用再输入mknod命令。

3.实验步骤

(1)画出流程图。

该实验流程图如图8.9所示。

图8.98.6.1实验流程图

(2)编写代码。

该实验源代码如下所示。

/*pipe_select.c*/

#includefcntl.h>

#includestdio.h>

#includeunistd.h>

#includestdlib.h>

#includestring.h>

#includetime.h>

#includeerrno.h>

#defineFIFO1in1

#defineFIFO2in2

#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;iIN_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;iIN_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_read0)

{

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]='';

printf(%s,buf);

}

}

}/*endofif*/

}/*endoffor*/

}

break;

}/*endofswitch*/

}/*endofwhile*/

return0;

}

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

数字通信相关文章:数字通信原理


通信相关文章:通信原理



上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭