2016-07-04 5 views
0

は私がポートXに耳を傾け、 "ランチャー" のプログラムを持って、その後、フォークと他のprocessess()C++ Linux上でfork()の後に子プロセスのバインドポートを防ぐ方法は?

signal(SIGCHLD, SIG_IGN); 
    a.sin_port=htons(atoi(argv[1])); 
     if(bind(os,(struct sockaddr *)&a,sizeof(a)) == -1) { 
      if(Debug){ 
      printf("Launher: Can't bind our address (%s)\n", argv[1]); 
     } 
      exit(1); 
     } 

フォークを開始:私は "ランチャー" 再起動afrer、しかし

int pid = fork(); 
     if (pid == 0) 
     { 
      execl("udp-proxy/udp_proxy","udp-proxy/udp_proxy",listenPort.c_str(),listenClient.c_str(),listenHost.c_str(),nullptr); 
     } 

を、 「Launher:アドレスをバインドできません」というメッセージが表示されます。

"lsof -i UDP"でチェックしたところ、子プロセスがこのポートをリッスンしているように見えるので、再度バインドすることはできません。 同じバインドされたソケットを使用する子プロセスを防ぐことはできますか?私は、「ファイルディスクリプタ」について何かを読んで、私はそれを防ぐ方法:(解決のための@Dietrichエップへ

+0

子プロセスができます柱すべてで、そのソケットが必要ですstは 'SOCK_CLOEXEC'を使用しますか? –

+0

いいえ、彼らはそれを必要としません。しかし、どこでSOCK_CLOEXECフラグを正確に設定すべきですか?親プロセスまたは子プロセスでは? – Mona

+0

Linuxの場合、 'man 2 socket'を参照してください:http://linux.die.net/man/2/socket –

答えて

1

感謝を知らない

SOCK_CLOEXECフラグを追加する問題を修正

前:。。

int os=socket(PF_INET,SOCK_DGRAM,IPPROTO_IP); 

:?

int os=socket(PF_INET,SOCK_DGRAM|SOCK_CLOEXEC,IPPROTO_IP); 
関連する問題