C ++如何在Linux上的fork()之后阻止子进程绑定端口?

时间:2016-07-04 20:20:29

标签: c++ linux fork

我有一个“启动程序”程序,它侦听端口X,然后使用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 );
        }

然而,在我重启“启动器”后,它会显示一条消息:“Launher:无法绑定我们的地址”。

我使用“lsof -i UDP”检查,似乎子进程正在侦听此端口,因此无法再绑定。 是否可以使用相同的绑定套接字来防止子进程?我读了一些关于“文件描述符”的内容,但我不知道如何防止它:(

1 个答案:

答案 0 :(得分:1)

感谢@Dietrich Epp寻求解决方案。

添加SOCK_CLOEXEC标志可以解决问题。

在:

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

后:

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