【问题标题】:How to start a child process of a daemon process which itself is not daemon如何启动本身不是守护进程的守护进程的子进程
【发布时间】:2012-07-17 10:36:36
【问题描述】:

我在网上找到了interesting problem。我将在此处复制以供参考。

我正在编写一个daemon 进程来执行程序然后重新启动 如果他们退出时的状态不是 EXIT_SUCCESS;但这些程序可能不想成为守护进程 自己处理。如果我使用fork() 然后调用execv() 将 新的子进程也是守护进程吗?

我尝试运行 firefox,但没有成功。那么,在这种情况下,如何 我可以像正常进程一样启动子进程吗?

该网站提供的解决方案不知何故无法说服我。有什么想法吗?

【问题讨论】:

  • 复制自here。请不要从其他网站逐字复制文本并将其发布在 SO
  • 而且没有好的解决方案
  • 您可以在引用源的帖子中指出相同的内容。
  • 如果您复制有疑问,这并不意味着您也复制了解决方案。我不理解解决方案,所以为什么不使用 SO!!
  • 我并不是不鼓励您在 SO 中澄清的其他网站上找到的东西,但只是您应该粘贴数据 逐字 这使得 SO 看起来像一个克隆网站。当您逐字复制某些内容时,注明来源非常重要

标签: c linux unix daemon


【解决方案1】:

如果你所说的守护进程是指stdin、stdout和stderr的文件描述符没有连接到任何tty或pts,那么是的。因此,只需为 stdin、stdout 和 stderr 打开 something 即可。

但是,您应该先自己尝试一下,firefox(此处)完美打开,stdin、stdout 和 stderr 重定向到/dev/null。我认为主要是您调用execv()execve() 并保留DISPLAY 变量。

编辑
如果您询问如何重新连接到原始描述符目的地,那么至少没有便携式解决方案。显然你不能重新连接到管道。但是,您可以(至少在 linux 下)重新连接到您来自的 tty/pts,甚至是文件(使用/proc 文件系统和readlink())。您将不得不猜测“寻找”(例如,如果原始命令是 foo 2>> bar)。

【讨论】:

  • 我们创建守护进程时创建的不同会话怎么样
  • 这不是问题,好吧,如果是 Firefox,他们只需要一些 i18n 和 DISPLAY 变量
  • 标准过程是重新获取终端:打开 /dev/tty 并通过 fd 进行 dup2(){012}。进程组是不同的东西。
  • 我必须承认,我没有按原样尝试过这个例子,我只是根据你的描述创建了我自己的守护进程,然后尝试将 execv()firefox 分叉
  • @wildplasser:这将连接到 a tty,不一定是您开始使用的那个。但根据您要实现的目标,这可能是可行的方法。
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
相关资源
最近更新 更多