我有一个“启动程序”程序,它侦听端口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”检查,似乎子进程正在侦听此端口,因此无法再绑定。 是否可以使用相同的绑定套接字来防止子进程?我读了一些关于“文件描述符”的内容,但我不知道如何防止它:(
答案 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);