在C中制作fifo
问题描述:
我的代码有两个问题。在C中制作fifo
第一个问题是,一旦我创建了一个fifo,我不知道如何在代码中添加一个条件以便将来运行,如果fifo存在 - 那么就不要创建它。试图谷歌,“访问”不起作用(它只是在那里,并没有继续)。
我的第二个问题是,代码卡在“打开(”MyFifo ...“行,即使这是我创建fifo后的第一次(意思是我刚创建了fifo,mkfifo成功了,并且我到达的open()线 - 这是卡在那里)
//create new fifo
if(mkfifo("myFifo",0666)<0)
{
perror("fifo creation failed.");
exit(1);
}
//get fifo fd
if((fd=open("myFifo",O_RDONLY))==-1)
{
perror("failed opening fifo.");
exit(1);
}
任何想法,我做错了
答
函数调用你要找的是stat
如果该文件存在,它将填补。?。具有修改时间等文件属性的struct stat
如果文件不存在,stat()
将返回-1和errno
将被设置为EACCESS
。
打开FIFO读取正常阻塞,直到一些其它进程打开的写作相同的FIFO,反之亦然。
要让open()
停止挂起,请启动另一个首先写入FIFO的进程。如果其他进程打开先写入的FIFO,则读取程序根本不会挂在open()
上。
谢谢。另一个问题:从fifo读取也阻止?我的意思是,如果我读了一个空的fifo,我的过程将被阻止,直到有人写信给它?我怎样才能实现“当有人写信给fifo时阅读”? – Jjang 2013-05-12 20:57:17
FIFO上的'read'阻塞,直到另一个进程'写'给它。参见[Beej的Unix IPC指南](http://beej.us/guide/bgipc/output/html/multipage/fifos.html)。 – andrewdotn 2013-05-12 21:04:21
'EACCESS'不是从'stat()'得到的唯一可能的错误;如果名称是路径名,并且其中一个组件是不存在的目录或ELOOP,或者......您可以获得ENOTDIR,但只需尝试创建FIFO并不一定是不可行的,错误不是'EEXIST'。然后你知道这个名字存在;你只需要使用'stat()'来验证它是否是一个FIFO('S_ISFIFO()')。 – 2013-05-12 22:03:21