免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1558 | 回复: 2
打印 上一主题 下一主题

[Linux] 有名管道的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-19 18:17 |只看该作者 |倒序浏览
最近看了进程间通信中的有名管道通信方式。以下是网上看的一个有名管道的示例程序:

读进程:
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FIFO "/tmp/myfifo"
main(int argc,char** argv)
{
char buf_r[100];
int fd;
int nread;
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
printf("cannot create fifoserver\n");
printf("Preparing for reading bytes....\n");
memset(buf_r,0,sizeof(buf_r));
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd==-1)
{
perror("open");
exit(1);
}
while(1){
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1){
if(errno==EAGAIN)
printf("no data yet\n");
}
printf("read %s from FIFO\n",buf_r);
sleep(1);
}

pause();
unlink(FIFO);
}


写进程:
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FIFO_SERVER "/tmp/myfifo"
main(int argc,char** argv)
{
int fd;
char w_buf[100];
int nwrite;
if(fd==-1)
if(errno==ENXIO)
printf("open error;no reading process\n");
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
if(argc==1)
printf("Please send something\n");
strcpy(w_buf,argv[1]);
if((nwrite=write(fd,w_buf,100))==-1)
{
if(errno==EAGAIN)
printf("The FIFO has not been read yet. Please try later\n");

}
else
printf("write %s to the FIFO\n",w_buf);
}


程序大致看明白了,但是还有一些小的疑问,希望有高手可以请教
问题1:
程序中红色字体部分是什么意思?是不是说,管道通信中,在写数据之前,要保证上一次写的数据已经被读进程给读出去了。如果上一次写的数据还没有被读出去,就会出现红色字体显示的错误?
问题2:
程序中绿色字体部分,用的是while(1)的循环,这不是死循环吗,程序中能这样吗?那读进程什么时候才能终止啊?
问题3:
程序中紫色字体部分,pause函数阻塞读进程,那它等待的是什么信号呢?写进程中没有给读进程发送信号啊?

论坛徽章:
0
2 [报告]
发表于 2012-07-21 08:49 |只看该作者
问题1,红色部分,你可以看它打印的内容。说明是管道的缓存写满了,而读取的那边还没有读,所以写不进去了。
问题2,因为是示例程序,所以用while循环。注意里面的sleep(1),它可以避免因为程序死循环而导致进程占用过多CPU资源
问题3,在linux命令行中,用man pause可以查看该函数的作用

论坛徽章:
0
3 [报告]
发表于 2012-07-21 21:44 |只看该作者
@wy200747055
1 因为你是用非阻塞方式打开的管道,fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
当socket的缓存容量不足以容纳要write的字节数时,write会立即返回,并设置errno==EAGAIN(亦或EWOULDBLOCK,表明非阻塞模式下调用了阻塞操作),这不是一种错误,应继续之前操作
2 这就是由上述原因所引起的循环读操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP