【问题标题】:Create a new independent process from another C process从另一个 C 进程创建一个新的独立进程
【发布时间】:2009-05-29 18:31:38
【问题描述】:
存在两个 C 可执行文件 A 和 B。
A 和 B 通过套接字相互通信。
B可以独立启动,也可以通过A启动。
如果先启动 B,然后启动 A,则 A 和 B 可以正常启动而不会出现问题。
即使A重新启动,也没有问题。
如果 B 通过 A 启动,则 A 和 B 正常启动。但是这里的通信端口是A和B都绑定的。这里如果A重启了,那么A就启动失败了。
由于 B 是通过 A 启动的,所以进程 A 是进程 B 的父进程。
那么,有没有什么方法可以让进程 B 独立于进程 A 启动呢?
我们尝试使用 fork,但是当我们尝试启动 exe 时使用 fork,会启动两个进程而不是一个。
【问题讨论】:
标签:
c
process
sockets
exec
fork
【解决方案1】:
您是否尝试过使用“包装器”可执行文件分叉两次——一次用于 A,一次用于 B——然后自行终止?这将使 A 和 B 作为单独的进程处于活动状态,然后由 init 进程继承,并且应该可以安全地重新启动。
【解决方案2】:
您确定您正确检查了 fork() 的返回值吗?
喜欢:
pid_t pid;
if (pid == 0) {
/* child */
}
else if (pid > 0) {
/* parent */
}
else {
/* error */
}
【解决方案3】:
您使用的是 Unix 域套接字还是常规网络套接字?
A 或 B 中的哪个进程正在侦听套接字(被动打开),哪些正在执行主动打开?
当您决定 A 应该运行 B 时,代码如何确定这是必要的?
你是在 fork 和 exec 之前打开套接字吗?
我对所提供信息的印象是:
但我很容易弄错。
我想知道你是否遇到了问题,因为 A 在你 fork 和 exec B 之前已经创建了活动套接字,所以当 A 终止时,套接字的活动端没有干净地关闭,因为 B 有一个套接字副本打开以供写入以及 A. 当你 fork 时,子进程应该在执行另一个进程之前清理不需要的文件描述符(例如套接字)。