2016-11-18 4 views
1

最初に:これは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を開いたままにしてもよろしいですか?

答えて

0

私はすべての子供のためのsocketpair()を呼び出す必要はないと思う、それはサーバー側の追加のソケットを追跡する必要があることを意味します。私が見つけたのは、 'worker_sd'のclose()を削除すると、私が望むだけ多くの子プロセスを追加できるということです。それを閉じて子プロセスを作成すると、新しい子は親から何かを受け取ろうとしたときに死にました。私はこれが起こることを感じました、そして、それはしました。

0

ワーカーソケットを閉じた後にspawnp()をもう一度呼び出すことはできますか?

このソケットでcloseを呼び出した後、ファイルディスクリプタはこのプロセスで無効になります。

異なる子プロセスからのメッセージがインターリーブ/破損しないように、子プロセスごとに別々のソケットペアが必要になることがあります。

関連する問題