c++ - socketpair() & 在 worker socket 的 close() 之后创建新的子进程

标签 c++ sockets socketpair

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

在我的系统中,我有一个启动 X 个 child 的“头”程序。该头在传入连接上调用 accept() 并立即通过 sendmsg() 将套接字交给子进程之一。 children 都坐在 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 保持打开状态吗?

最佳答案

Can I call spawnp() again after I've closed the worker socket?

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

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

关于c++ - socketpair() & 在 worker socket 的 close() 之后创建新的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40680589/

相关文章:

c++ - 调用 socket::connect、socket::bind、socket::listen 之前不使用 getaddrinfo( ) 函数

c++ - 将项目移动到 Visual Studio 2012

c++ - write(2) 返回零意味着什么?我最终会取得进展(非零结果)吗?

c++ - 指针初始化

c++ - 使用 Live555 从连接到 H264 编码器的 IP 摄像机流式传输实时视频

c - select() 方法不返回,因此阻塞

c++ - 无法使 getnameinfo 处理我的 UDP 代码

java - 如何在java中的UDP无连接客户端-服务器对的固定端口上运行客户端程序

rust - 为什么我无法使用 Tokio UnixStream 与 fork 子进程通信?

c++ - linux:fork/socketpair/close 和多个子进程