2016-07-04 117 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); 
     } 

叉:

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); 
     } 

然而,afrer我重啓了 「發射」,它會顯示一條消息:「Launher:無法綁定我們的地址」。

我用「lsof -i UDP」進行了檢查,似乎子進程正在監聽這個端口,所以它不能被再次綁定。 是否可以使用相同的綁定套接字來阻止子進程?我讀一些有關「文件描述符」,但我不知道如何阻止它:(

+0

執行子進程需要在所有的插座你能舉? st使用'SOCK_CLOEXEC'? –

+0

不,他們不需要它。但我應該在哪裏設置SOCK_CLOEXEC標誌?在父母或孩子的過程中? – Mona

+0

在Linux上,請參閱'man 2 socket':http://linux.die.net/man/2/socket –

回答

1

感謝@Dietrich埃普爲解決

添加SOCK_CLOEXEC標誌解決問題

前:

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

後:

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