2

存在两个 C 可执行文件 A 和 B。A 和 B 通过套接字相互通信。

B可以独立启动,也可以通过A启动。

  1. 如果先启动 B,然后再启动 A,则 A 和 B 可以正常启动而不会出现问题。即使A重新启动,也没有问题。

  2. 如果 B 通过 A 启动,则 A 和 B 正常启动。但是这里的通讯口绑定了A和B。这里如果A重启了,那么A就启动失败了。

由于 B 是通过 A 启动的,因此进程 A 是进程 B 的父进程。

那么,有没有什么方法可以让进程 B 独立于进程 A 启动呢?

我们尝试使用fork,但是当我们尝试启动exe时使用fork,正在启动两个进程而不是一个。

4

3 回答 3

3

您是否尝试过使用分叉两次的“包装器”可执行文件——一次用于 A,一次用于 B——然后自杀?这将使 A 和 B 作为单独的进程处于活动状态,然后由 init 进程继承,并且应该可以安全地重新启动。

于 2009-05-29T18:38:17.597 回答
0

您使用的是 Unix 域套接字还是常规网络套接字?

哪个进程,A 或 B,正在侦听套接字(被动打开),哪个正在执行主动打开?

当您决定 A 应该运行 B 时,代码如何确定这是必要的?

你在分叉和执行之前打开套接字吗?

我对所提供信息的印象是:

  • 您使用网络套接字
  • B 是听众

但我很容易误会。

我想知道您是否遇到问题,因为 A 在您分叉和执行 B 之前已经创建了活动套接字,所以当 A 终止时,套接字的活动端没有干净地关闭,因为 B 有一个套接字副本打开以供写入以及A. 当你 fork 时,子进程应该在执行另一个进程之前清理不需要的文件描述符(例如套接字)。

于 2009-05-31T19:38:56.230 回答
0

您确定您正在正确检查fork()的返回值吗?

喜欢:

pid_t pid;
if (pid == 0) {
    /* child */
}
else if (pid > 0) {
    /* parent */
}
else {
    /* error */
}
于 2009-05-29T23:49:11.587 回答