命名管道
我这里有个命名管道的小程序,如下所示:
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#define FIFO_file "/tmp/fifo"
#define DATA "00000001"
main()
{
int openfifo;
unlink(FIFO_file);
if((mkfifo(FIFO_file,O_WRONLY|O_CREAT))<0)
{
printf("1 error\n");
exit(1);
}
if((openfifo=open(FIFO_file,O_WRONLY))<0)
{
printf("2 error\n");
exit(2);
}
if(write(openfifo,DATA,8) < 8){
printf("3 error\n");
exit(3);
}
close(openfifo);
}
1、创建管道后,调用open打开,函数就阻塞在open上了,但是如果cat该管道,程序就能跑下去,这是为什么了?
2、如果open属性为O_RDWR,程序就能顺利跑下去,但是管道文件里头没东西了,这是什么原因?
欢迎高手指点
问题点数:20、回复次数:7Top
1 楼shuimuyu(水木鱼)回复于 2005-05-17 13:10:54 得分 0
各位高人帮帮忙啊Top
2 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2005-05-17 13:51:53 得分 1
upTop
3 楼loveleijuforever(苦力)回复于 2005-05-17 20:01:15 得分 6
其实你是阻塞在write了,只不过表面上看起来是阻塞在open.
命名管道自动支持进程阻塞,你没读没写的他怎么向下执行?你cat以后相当于读了,当然它向下执行了。
你翻了一个错误:命名管道必须同时有读写两个进程,只写或者只读都不行。Top
4 楼zjyu88(刚步入三流大学)回复于 2005-05-17 20:44:23 得分 6
你翻了一个错误:命名管道必须同时有读写两个进程,只写或者只读都不行。
一个进程在读或写,没有其它进程来对它这个FIFO写或读,应该会阻塞的啊...为什么不行??Top
5 楼shuimuyu(水木鱼)回复于 2005-05-18 08:55:25 得分 0
其实你是阻塞在write了,只不过表面上看起来是阻塞在open.
loveleijuforever(网民) ,这句话能不能具体解释一下,因为用输出语句调试是停在open这个地方Top
6 楼shuimuyu(水木鱼)回复于 2005-05-19 08:46:46 得分 0
自己up一下Top
7 楼9653013(csL阴转晴)回复于 2005-05-19 15:07:12 得分 7
阻塞在open了。
open(FIFO_file,O_WRONLY)时,必须有一个进程open(FIFO_file,O_RDONLY),前一个函数才返回。
同样,write()的时候只有另外一个进程read,write才返回。Top




