我在网上发现了一个有趣的问题。我在这里复制它以供参考。
我正在编写一个
daemon
执行程序的过程,然后如果它们以除EXIT_SUCCESS
;以外的状态退出,则重新启动它们。但是这些程序本身可能不想成为守护进程。如果我使用fork()
然后调用execv()
新的子进程也会是一个守护进程吗?我尝试运行firefox,但没有成功。那么,在这种情况下,如何将子进程作为正常进程启动?
该网站提供的解决方案不知何故无法说服我。有任何想法吗?
如果守护进程是指stdin、stdout 和stderr 的文件描述符没有连接到任何tty 或pts,那么是的。因此,只需为标准输入、标准输出和标准错误打开一些东西就可以了。
但是,您应该先自己尝试一下,firefox(此处)完美打开,stdin、stdout 和 stderr 重定向到/dev/null
. 我认为主要是你调用execv()
orexecve()
并保留DISPLAY
变量。
编辑
如果您询问如何重新连接到原始描述符目的地,那么至少没有便携式解决方案。显然你不能重新连接到管道。但是,您可以(至少在 linux 下)重新连接到您来自的 tty/pts,甚至是文件(使用/proc
文件系统和readlink()
)。不过,您将不得不猜测“seek”(例如,如果原始命令是foo 2>> bar
)。