2013-05-12 111 views
0

我的代码有两个问题。在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); 
} 

任何想法,我做错了

回答

1

函数调用你要找的是stat如果该文件存在,它将填补。?。具有修改时间等文件属性的struct stat如果文件不存在,stat()将返回-1和errno将被设置为EACCESS


mkfifo man page说,

打开FIFO读取正常阻塞,直到一些其它进程打开的写作相同的FIFO,反之亦然。

要让open()停止挂起,请启动另一个首先写入FIFO的进程。如果其他进程打开先写入的FIFO,则读取程序根本不会挂在open()上。

+0

谢谢。另一个问题:从fifo读取也阻止?我的意思是,如果我读了一个空的fifo,我的过程将被阻止,直到有人写信给它?我怎样才能实现“当有人写信给fifo时阅读”? – Jjang 2013-05-12 20:57:17

+2

FIFO上的'read'阻塞,直到另一个进程'写'给它。参见[Beej的Unix IPC指南](http://beej.us/guide/bgipc/output/html/multipage/fifos.html)。 – andrewdotn 2013-05-12 21:04:21

+1

'EACCESS'不是从'stat()'得到的唯一可能的错误;如果名称是路径名,并且其中一个组件是不存在的目录或ELOOP,或者......您可以获得ENOTDIR,但只需尝试创建FIFO并不一定是不可行的,错误不是'EEXIST'。然后你知道这个名字存在;你只需要使用'stat()'来验证它是否是一个FIFO('S_ISFIFO()')。 – 2013-05-12 22:03:21