우선 : Unix/Linux 시스템이 아닙니다. IBM AS/400 V7R1 (C++ 98)에서 작업 중이며 fork()에 액세스 할 수 없습니다. 그럼에도 불구하고 새로운 하위 프로세스를 시작하기 위해 spawnp()가 있고 AS/400은 프로세스 그룹의 개념을 지원합니다.workerpair() 작업자 소켓 close() 후 새 하위 프로세스 만들기
내 시스템에는 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를 열어 두어도 괜찮습니까?