最初に:これはUnix/Linuxシステムではありません。 IBM AS/400 V7R1(C++ 98)で作業しており、fork()へのアクセス権がありません。それにもかかわらず、新しい子プロセスを開始するためのspawnp()とAS/400はプロセス・グループの概念をサポートしています。workerpair()&ワーカーソケットclose()の後に新しい子プロセスを作成する
私のシステムでは、X個の子を起動する「ヘッド」プログラムがあります。このヘッドは着信接続でaccept()を呼び出し、ソケットをsendmsg()を介して子プロセスの1つにすぐに渡します。子供たちはすべて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()呼び出しを再度実行させる何らかの信号を送るつもりです。 "close(worker_sd)"には私の心配があります。ワーカーソケットを閉じた後にspawnp()をもう一度呼び出すことはできますか?結局、それは単なる数字なのです。 worker_sdを開いたままにしてもよろしいですか?