【问题标题】:Create a new independent process from another C process从另一个 C 进程创建一个新的独立进程
【发布时间】:2009-05-29 18:31:38
【问题描述】:

存在两个 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,会启动两个进程而不是一个。

【问题讨论】:

    标签: 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 之前打开套接字吗?

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

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

        但我很容易弄错。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-25
          • 1970-01-01
          相关资源
          最近更新 更多