如何启动守护进程的子进程本身不是守护进程

时间:2012-07-17 10:36:37

标签: c linux unix daemon

我在网上找到了interesting problem。我会在这里复制它以供参考。

  

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

     

我试过运行firefox但它没有用。那么,在哪种情况下,如何   我可以将子进程作为正常进程启动吗?

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

1 个答案:

答案 0 :(得分:0)

如果通过守护进程你的意思是stdin的文件描述符,stdout和stderr没有连接到任何tty或pts,那么是的。所以只需为stdin打开某些东西,stdout和stderr就可以了。

但是,你应该先自己尝试一下,firefox(这里)完全打开stdin,stdout和stderr重定向到/dev/null。我认为最重要的是您致电execv()execve()并保留DISPLAY变量。

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