我有一个使用Linux的RTAI扩展构建的系统。它有一个在启动时以root身份运行的进程。它创建了一些命名管道和chmod 777。管道由root拥有并具有权限prwxrwxrwx,但是没有任何用户进程可以写入或读取它们。管道(如图C所示)制成管道
unlink(pipename);
mkfifo(pipename, 0777);
chmod(pipename, 0777);
如果我以root用户身份登录,su为root,终止进程并重新启动它,从root用户出来,命名管道仍由root拥有并具有权限prwxrwxrwx但是这次,用户进程可以读写来自他们。
问题:如果程序作为启动过程的一部分运行,我还需要做什么才能访问命名管道。
另外,如何确保它是在设置完所有通信机制后执行的最后一个进程。
修改
我已更改了标题(旧的为引导过程设置管道权限)
我终于通过将进程转移到rc.local来实现它。由于编码器使用RTAI,他认为该过程必须与所有其他RTAI过程同时启动。其他进程没有使用任何Unix通信机制,所以它并不重要。当他开始使用管道时,必须将其转移到多用户级别的末尾。
这是我无法找到解释的部分:在启动过程中的哪一点可以使用管道?我把它转移到了最后但可能更早。
答案 0 :(得分:0)
花了一段时间才弄清楚如何找出这个过程的状态。所有程序都只是阻止打开。我可以试试O_NONBLOCK,但我不知道它会有多好用。我也讨厌投票。
流程是否在open()
上挂起取决于开放模式(O_RDONLY
,O_WRONLY
,O_RDWR
)。
没有O_NONBLOCK
:
O_RDONLY
,open()
将阻止,直到fifo被打开以便从任何进程写入; O_WRONLY
,open()
会阻止,直到打开fifo来阅读任何流程; O_RDWR
,open()
将立即返回。使用O_NONBLOCK
:
O_RDONLY
,open()
将立即返回; O_WRONLY
,open()
如果未打开fifo从任何进程读取,则会返回错误; O_RDWR
,open()
将立即返回。查看open(3)
(O_NONBLOCK
部分)和fifo(7)
中的详细信息。
如果open()
挂起,则表示:
O_RDONLY
或O_WRONLY
而不使用O_NONBLOCK
; 如果您希望从另一个进程中打开fifo,请检查它为什么不是。可能是一个应该让它保持打开状态的过程,或者你以错误的顺序启动进程,或者存在竞争条件。
否则,您可以执行以下操作之一:
使用O_RDWR
开启模式,open()
将立即返回。
但是,请注意,从fifo读取时(因为您保持阅读结束打开时)或EOF
写入fifo时,您永远不会获得SIGPIPE
(因为您&#39} ;保持写作结束了。)
使用O_RDONLY | O_NONBLOCK
,open()
将立即返回。
请注意,如果未打开fifo以从任何进程读取,则read()
将返回EOF
。
稍后打开fifo,当另一个进程已经打开fifo的另一端时。
答案 1 :(得分:0)
终于找到了问题的根源。
简而言之,修复是
我的问题的答案是将它放在rc.local中,用于Ubuntu,Centos和Debian,在.local之后用于SuSE。