1

我在网上发现了一个有趣的问题。我在这里复制它以供参考。

我正在编写一个daemon执行程序的过程,然后如果它们以除 EXIT_SUCCESS;以外的状态退出,则重新启动它们。但是这些程序本身可能不想成为守护进程。如果我使用fork()然后调用execv()新的子进程也会是一个守护进程吗?

我尝试运行firefox,但没有成功。那么,在这种情况下,如何将子进程作为正常进程启动?

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

4

1 回答 1

0

如果守护进程是指stdin、stdout 和stderr 的文件描述符没有连接到任何tty 或pts,那么是的。因此,只需为标准输入、标准输出和标准错误打开一些东西就可以了。

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

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

于 2012-07-17T11:26:11.660 回答