簡體   English   中英

C ++如何在Linux上的fork()之后防止子進程綁定端口?

[英]C++ How to prevent child process binding port after fork() on Linux?

我有一個“啟動器”程序,它監聽端口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 );
        }

但是,在重新啟動“啟動器”之后,它顯示一條消息:“啟動器:無法綁定我們的地址”。

我檢查了“ lsof -i UDP”,似乎子進程正在偵聽此端口,因此無法再次綁定該端口。 是否可以防止子進程使用相同的綁定套接字? 我讀了一些有關“文件描述符”的內容,但我不知道如何防止它:(

感謝@Dietrich Epp提供解決方案。

添加SOCK_CLOEXEC標志可解決此問題。

之前:

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

后:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM