[英]socketpair() & creating new child processes after close() of worker socket
首先:这不是Unix / Linux系统。 我正在使用IBM AS / 400 V7R1(C ++ 98)并且无法访问fork()。 不过,我确实有spawnp()来启动新的子进程,AS / 400支持进程组的概念。
在我的系统中,我有一个“头”程序,可以启动X个孩子。 这个头在传入的连接上调用accept()并立即通过sendmsg()将套接字提供给子进程之一。 孩子们都坐在recvmsg()上。 对于头部程序,它是这样的:
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);
我有一个理由/计划在初始程序启动后启动其他子进程。 我计划向头程序发送一些信号,这将导致spawnp()调用再次执行。 然而,“关闭(worker_sd)”让我很担心。 我关闭工作套接字后可以再次调用spawnp()吗? 毕竟,这只是一个数字。 是否可以保持worker_sd打开?
我关闭工作套接字后可以再次调用spawnp()吗?
在该套接字上调用close
后,文件描述符在此过程中不再有效。
您可能希望为每个子进程分别使用一个socketpair,以便来自不同子进程的消息不会交错/损坏。
我认为为每个孩子调用socketpair()是不必要的,这意味着必须跟踪服务器端的其他套接字。 我发现删除'worker_sd'上的close()允许我创建尽可能多的额外子进程。 关闭它并创建一个子进程会导致新的孩子在尝试从父级接收内容时死亡。 我觉得这将会发生,而且确实如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.