这是我用于执行命令的代码的轻量级版本:
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方法在我的服务器端应用程序中用于运行不同类型的进程,包括守护进程。但是在这里我注意到一个问题:
当服务器运行一个子守护进程时,它(服务器)被杀死或崩溃,子进程开始监听服务器正在监听的端口。
那么,如何执行命令并确保它不会在服务器结束(崩溃、死亡)后保持服务器端口繁忙?