我在网上找到了interesting problem。我会在这里复制它以供参考。
我正在编写
daemon
进程来执行程序然后重新启动 如果他们退出的状态不是EXIT_SUCCESS
;但是这些程序可能不希望成为守护进程 处理自己。如果我使用fork()
,则会调用execv()
新的子进程也是一个守护进程吗?我试过运行firefox但它没有用。那么,在哪种情况下,如何 我可以将子进程作为正常进程启动吗?
该网站提供的解决方案不知何故让我信服。有什么想法吗?
答案 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
)。