在C语言中打开FIFO有问题

4

我在C语言中打开FIFO遇到了麻烦。首先,我使用mkfifo()函数创建它们,并设置权限为0777。当我尝试打开它们时,只能成功打开第一个FIFO,然后进程将卡在打开第二个FIFO上。以下是我的代码:

fd1 = open("FIFO1_PATH", O_WRONLY );
fd2 = open("FIFO2_PATH", O_WRONLY );

这段代码不会被执行,但是当我注释掉第二行时,它就可以执行!一个进程打开FIFO的数量有限制吗?我不知道为什么会发生这种情况...我已经花了3个小时试图找出问题所在,但没有任何结果 :(


1
哈哈,我解决了问题:D。我应该使用“O_NONBLOCK”选项打开它们,因为如果我们假设没有其他进程打开读取,它将永远在第一次open()中阻塞。谢谢。 - ObjProg
@user 做得好!请将您的解决方案发布为答案。 - moinudin
我又遇到问题了 :(,打开操作会执行但返回-1。 - ObjProg
如果函数返回 -1,检查 errno(或者例如调用 perror() 函数)以了解失败原因。 - nos
1
请注意,您永远不希望执行FIFO,因此没有设置权限上的“x”位的好理由;如果必须使用666权限,请考虑所有人和他的狗是否应该能够写入您的FIFO(有时答案是肯定的,有时则不是一个好主意)。 - Jonathan Leffler
2个回答

5

我已经明白了 :)

我必须让开启的进程等待直到另一个进程打开FIFO以进行读取(并且它将是一个阻塞式读取)。 通过在写入进程上使用sleep,我将确保其他进程将打开以进行读取。


0
关于限制的问题,Linux 的默认进程文件描述符是 1024。你的问题可能是没有打开第二个 FIFO 进行读取,因此写入操作被阻塞了。

哦,抱歉我忘了提到我正在尝试打开两个不同的FIFO :) - ObjProg
啊,你确定第二个FIFO也是为读取而打开的吗?否则,写入时会被阻塞。 - Marek Sapota

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接