在启动过程的什么时候可以使用管道

时间:2016-01-26 06:53:15

标签: linux named-pipes boot rtai

我有一个使用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通信机制,所以它并不重要。当他开始使用管道时,必须将其转移到多用户级别的末尾。

这是我无法找到解释的部分:在启动过程中的哪一点可以使用管道?我把它转移到了最后但可能更早。

2 个答案:

答案 0 :(得分:0)

问题

  

花了一段时间才弄清楚如何找出这个过程的状态。所有程序都只是阻止打开。我可以试试O_NONBLOCK,但我不知道它会有多好用。我也讨厌投票。

流程是否在open()上挂起取决于开放模式(O_RDONLYO_WRONLYO_RDWR)。

  • 没有O_NONBLOCK

    • O_RDONLYopen()将阻止,直到fifo被打开以便从任何进程写入;
    • O_WRONLYopen()会阻止,直到打开fifo来阅读任何流程;
    • O_RDWRopen()将立即返回。
  • 使用O_NONBLOCK

    • O_RDONLYopen()将立即返回;
    • O_WRONLYopen()如果未打开fifo从任何进程读取,则会返回错误;
    • O_RDWRopen()将立即返回。

查看open(3)O_NONBLOCK部分)和fifo(7)中的详细信息。

如果open()挂起,则表示:

  • 您正在使用O_RDONLYO_WRONLY而不使用O_NONBLOCK;
  • fifo不会在任何其他过程中打开或阅读。

解决方案

如果您希望从另一个进程中打开fifo,请检查它为什么不是。可能是一个应该让它保持打开状态的过程,或者你以错误的顺序启动进程,或者存在竞争条件。

否则,您可以执行以下操作之一:

  • 使用O_RDWR开启模式,open()将立即返回。

    但是,请注意,从fifo读取时(因为您保持阅读结束打开时)或EOF写入fifo时,您永远不会获得SIGPIPE(因为您&#39} ;保持写作结束了。)

  • 使用O_RDONLY | O_NONBLOCKopen()将立即返回。

    请注意,如果未打开fifo以从任何进程读取,则read()将返回EOF

  • 稍后打开fifo,当另一个进程已经打开fifo的另一端时。

答案 1 :(得分:0)

终于找到了问题的根源。

  1. 我加了一个延迟,没有任何区别。
  2. 然后我发现即使我使用666 mkfifo,权限仍然是644.由于FIFO由root拥有,因此没有其他进程可以写入它。结果,我在mkfifo之后添加了一个chmod。这使得FIFO可写。
  3. 写作问题已得到解决,但作者仍然没有从开场回来。
  4. 这是一个特定的SuSE问题。这个过程是在boot.local中启动的,这太早了。在其他系统上,它可以在rc.local中启动,但在SuSE上,它必须在after.local上启动。将程序移动到after.local,一切都神奇地开始工作。
  5. 简而言之,修复是

      创建FIFO后
    1. chmod
    2. 将可执行文件移至SuSE上的after.local
    3. 我的问题的答案是将它放在rc.local中,用于Ubuntu,Centos和Debian,在.local之后用于SuSE。