簡體   English   中英

分叉的進程一直在監聽服務器的端口

[英]Forked process keeps listening to the server's port

這是我用於執行命令的代碼的簡化版本:

void close_all_nonestandard_fds()
{
    struct rlimit fds_limit;
    int max_fd = 1024;
    if (getrlimit(RLIMIT_NOFILE, &fds_limit) == 0) max_fd = fds_limit.rlim_cur;
    for(int i = 0; i <= max_fd; ++i) {
        if(i != STDERR_FILENO && i != STDOUT_FILENO && i != STDIN_FILENO) close(i);
    }
}

void exec_command(char* command, char*const* args)
{
    pid_t pid = fork();
    if(pid != 0)
    {
        if(pid == -1) throw_error("Failed to fork: %s", strerror(errno));
        // Parent
    }
    else
    {
        // Child
        close_all_nonestandard_fds();
        if(execv(command, args) == -1) throw_error("Failed to execv: %s", trerror(errno));
    }
}

exec_command方法在我的服務器端應用程序中用於運行exec_command的進程,包括守護進程。 但是在這里我注意到一個問題:

當服務器運行子守護進程時,子(守護程序)被殺死或崩潰,子進程開始監聽服務器正在監聽的端口。

因此,如何執行命令並確保在服務器結束后(崩潰,死亡)它不會使服務器的端口繁忙?

只需通過存儲所有服務器套接字來跟蹤它們 ,然后在fork()后在子進程中包含那些close()

這些是listen()套接字和accept()套接字。


更新:

另外,您可能想使用setsockopt()將選項SO_REUSEADDR設置為傳遞給bind()的套接字

SO_REUSEADDR

指示用於驗證bind(2)調用中提供的地址的規則應允許重用本地地址。 對於AF_INET套接字,這意味着套接字可以綁定,除非有活動的監聽套接字綁定到該地址。 當偵聽套接字通過特定端口綁定到INADDR_ANY時,則不可能為任何本地地址綁定到此端口。 參數是一個整數布爾值標志。

暫無
暫無

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

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