Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何启动本身不是守护进程的守护进程的子进程_C_Linux_Unix_Daemon - Fatal编程技术网

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

C 如何启动本身不是守护进程的守护进程的子进程,c,linux,unix,daemon,C,Linux,Unix,Daemon,我在网上找到了一份工作。我将在这里复制它以供参考 我正在编写一个守护进程来执行程序,然后重新启动 如果他们退出时的状态不是 退出成功;但这些程序可能不想成为守护进程 进程本身。如果我使用fork()然后调用execv()将 新的子进程也是守护进程吗 我试着运行firefox,但没有成功。那么,在这种情况下,如何 我可以像正常进程一样启动子进程吗 该网站提供的解决方案不知何故无法说服我。有什么想法吗?如果守护进程指的是stdin、stdout和stderr的文件描述符没有连接到任何tty或pts,

我在网上找到了一份工作。我将在这里复制它以供参考

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

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


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

如果守护进程指的是stdin、stdout和stderr的文件描述符没有连接到任何tty或pts,那么是的。所以只要为stdin、stdout和stderr打开一些东西就可以了

不过,您应该先自己尝试一下,firefox(此处)完全可以打开,stdin、stdout和stderr被重定向到
/dev/null
。我认为最主要的是调用
execv()
execve()
并保持
显示
变量

编辑

如果您询问如何重新连接到原始描述符目标,那么至少没有可移植的解决方案。显然,您无法重新连接到管道。但是,您可以(至少在linux下)重新连接到来自的tty/pts,甚至是文件(使用
/proc
文件系统和
readlink()
)。您必须猜测“seek”(例如,如果原始命令是
foo2>>bar
)。

从中复制。请避免从其他网站逐字复制文本并将其发布在SoC中,没有好的解决方案您可以在引用来源的帖子中指出同样的解决方案。如果您复制了疑问,这并不意味着您也复制了解决方案。我不理解这个解决方案,为什么不使用它呢!!我并不是在劝阻您不要在SO中澄清在其他站点上发现的内容,只是您应该一字不差地粘贴数据,这使SO看起来像一个克隆站点。当您逐字复制某些内容时,源代码的属性非常重要。我们创建Daemont时创建的不同会话如何?这不是问题,在firefox的情况下,他们只需要一些i18n和
显示变量。标准过程是通过fd获取终端:open/dev/tty和dup2(){012}。进程组是不同的东西。我必须承认,我没有像现在这样尝试这个示例,我只是根据您的描述创建了自己的守护进程,然后尝试
execv()
firefox在叉子中thereof@wildplasser:这将连接到tty,不一定是您开始使用的tty。但根据您试图实现的目标,这可能是一种方法。