【问题标题】:socketpair() & creating new child processes after close() of worker socketsocketpair() & 在工作套接字的 close() 之后创建新的子进程
【发布时间】:2017-04-02 12:16:52
【问题描述】:

首先:这不是 Unix/Linux 系统。我正在使用 IBM AS/400 V7R1 (C++ 98) 并且无权访问 fork()。不过,我确实有 spawnp() 来启动新的子进程,并且 AS/400 支持进程组的概念。

在我的系统中,我有一个启动 X 个孩子的“头部”程序。该头在传入连接上调用accept(),并立即通过sendmsg() 将套接字交给其中一个子进程。孩子们都坐在 recvmsg() 上。对于 head 程序,它是这样的:

rc = socketpair(AF_UNIX, SOCK_DGRAM, 0, pair_sd);
if (rc != 0) {
    perror("socketpair() failed");
    close(listen_sd);
    exit(-1);
}
server_sd = pair_sd[0];
worker_sd = pair_sd[1];

// do some other stuff, set up arguments for spawnp()...
// ...

spawn_fdmap[0] = worker_sd;

for (int i = 0; i < numOfChildren; i++) {
    pid = spawnp(spawn_argv[0], 1, spawn_fdmap, &inherit, spawn_argv, spawn_envp);
    if (pid < 0) {
        CERR << "errno=" << errno << ", " << strerror(errno) << endl;
        CERR << "command line [";
        for (int x = 0; spawn_argv[x] != 0; ++x) {
            cerr << spawn_argv[x] << " ";
        }
        cerr << ']' << endl;
        close(listen_sd);
        exit(-1);
    }
    else {
        CERR << "Child worker PID = " << pid << endl;
        child_pids.push_back(pid);
    }
}

// Close down the worker side of the socketpair.
close(worker_sd);

我有一个理由/计划在初始程序启动后启动其他子进程。我计划向 head 程序发送一些信号,这将导致 spawnp() 调用再次执行。 “close(worker_sd)”让我担心。我可以在关闭工作套接字后再次调用 spawnp() 吗?毕竟,这只是一个数字。保持worker_sd打开可以吗?

【问题讨论】:

    标签: c++ sockets socketpair


    【解决方案1】:

    我认为为每个孩子调用 socketpair() 是不必要的,这意味着必须跟踪服务器端的其他套接字。我发现删除“worker_sd”上的 close() 可以让我创建任意数量的附加子进程。关闭它并创建一个子进程会导致新子进程在尝试从父进程接收某些内容时死亡。我觉得这就是会发生的事情,而且确实发生了。

    【讨论】:

      【解决方案2】:

      我可以在关闭工作套接字后再次调用 spawnp() 吗?

      在该套接字上调用close 后,文件描述符在此进程中不再有效。

      您可能希望每个子进程都有一个单独的套接字对,这样来自不同子进程的消息就不会被交错/损坏。

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多