分叉进程一直在监听服务器的端口

时间:2012-10-29 16:30:47

标签: c++ c posix fork 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方法在我的服务器端应用程序中用于运行不同类型的进程,包括守护程序进程。但在这里我发现了一个问题:

当服务器运行子守护程序进程时,它(服务器)被杀死或崩溃,子进程开始侦听正在侦听的端口服务器。

那么,如何执行命令并确保在服务器结束(崩溃,死亡)后它不会保持服务器端口忙?

1 个答案:

答案 0 :(得分:1)

只需通过存储来跟踪所有服务器套接字,然后在fork()之后跟踪孩子中的close() d。

这些是listen()套接字和accept() ed套接字。


<强>更新

此外,您可能希望使用setsockopt()将选项SO_REUSEADDR设置为传递给bind()的套接字

  

SO_REUSEADDR

     

表示用于验证提供的地址的规则   bind(2)调用应该允许重用本地地址。对于AF_INET   套接字这意味着套接字可以绑定,除非有一个   积极倾听                 socket绑定到该地址。当侦听套接字绑定到具有特定端口的INADDR_ANY时,则无法进行   绑定到此端口以获取任何本地地址。参数是一个整数   布尔标志。