2016-11-18 5 views
1

우선 : 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를 열어 두어도 괜찮습니까?

답변

0

모든 자식에 대해 socketpair()를 호출하는 것은 불필요하며 서버 측에서 추가 소켓을 추적해야한다는 의미입니다. 내가 찾은 것은 'worker_sd'에 close()를 제거하면 내가 원하는만큼 많은 자식 프로세스를 생성 할 수 있다는 것이다. 그것을 닫고 자식 프로세스를 생성하면 새로운 자식이 부모로부터 무언가를 받도록 시도 할 때 죽게됩니다. 나는 이것이 일어날 것이라고 생각했고, 그렇게했다.

0

작업자 소켓을 닫은 후 spawnp()를 다시 호출 할 수 있습니까?

해당 소켓에서 close을 호출하면 파일 설명자가 더 이상이 프로세스에서 유효하지 않습니다.

각 자식 프로세스마다 별도의 소켓 쌍이 필요하므로 서로 다른 자식 프로세스의 메시지가 인터리브되거나 손상되지 않도록 할 수 있습니다.