Linux系统管道和有名管道的通信机制

ZDNet软件频道 时间:2008-06-30 作者:郑彦兴 | 赛迪网 我要评论()
本文关键词:命令行 Linux 技巧
本文在详细讨论了管道和有名管道的通信机制的基础上,用实例对其读写规则进行了程序验证,这样做有利于增强读者对读写规则的感性认识,同时也提供了应用范例。

程序2:与程序1一起测试写FIFO的规则,第一个命令行参数是请求从FIFO读出的字节数

#include 
#include 
#include 
#include 
#define FIFO_SERVER "/tmp/fifoserver"

main(int argc,char** argv)
{
char r_buf[4096*2];
int fd;
int r_size;
int ret_size;
r_size=atoi(argv[1]);
printf("requred real read bytes %dn",r_size);
memset(r_buf,0,sizeof(r_buf));
fd=open(FIFO_SERVER,O_RDONLY|O_NONBLOCK,0);
//fd=open(FIFO_SERVER,O_RDONLY,0);
//在此处可以把读程序编译成两个不同版本:阻塞版本及非阻塞版本
if(fd==-1)
{
printf("open %s for read errorn");
exit(); 
}
while(1)
{

memset(r_buf,0,sizeof(r_buf));
ret_size=read(fd,r_buf,r_size);
if(ret_size==-1)
if(errno==EAGAIN)
printf("no data avlaiblen");
printf("real read bytes %dn",ret_size);
sleep(1);
} 
pause();
unlink(FIFO_SERVER);
}

    程序应用说明:
    把读程序编译成两个不同版本。
    阻塞读版本:br
    以及非阻塞读版本:nbr
    把写程序编译成两个四个版本。
    非阻塞且请求写的字节数大于PIPE_BUF版本:nbwg
    非阻塞且请求写的字节数不大于PIPE_BUF版本:版本nbw
    阻塞且请求写的字节数大于PIPE_BUF版本:bwg
    阻塞且请求写的字节数不大于PIPE_BUF版本:版本bw
    下面将使用br、nbr、w代替相应程序中的阻塞读、非阻塞读
    验证阻塞写操作:

当请求写入的数据量大于PIPE_BUF时的非原子性:

nbr 1000 
bwg

当请求写入的数据量不大于PIPE_BUF时的原子性:

nbr 1000 
bw

验证非阻塞写操作:

当请求写入的数据量大于PIPE_BUF时的非原子性:

nbr 1000 
nbwg

请求写入的数据量不大于PIPE_BUF时的原子性:

nbr 1000 
nbw

不管写打开的阻塞标志是否设置,在请求写入的字节数大于4096时,都不保证写入的原子性。但二者有本质区别:

对于阻塞写来说,写操作在写满FIFO的空闲区域后,会一直等待,直到写完所有数据为止,请求写入的数据最终都会写入FIFO; 而非阻塞写则在写满FIFO的空闲区域后,就返回(实际写入的字节数),所以有些数据最终不能够写入。 对于读操作的验证则比较简单,不再讨论。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134