Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分叉进程不断侦听服务器';s端口_C++_C_Posix_Fork_Port - Fatal编程技术网

C++ 分叉进程不断侦听服务器';s端口

C++ 分叉进程不断侦听服务器';s端口,c++,c,posix,fork,port,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 != STDE

这是我执行命令的代码的轻版本:

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));
    }
}
void close\u all\u none标准\u fds()
{
结构限制fds_限制;
int max_fd=1024;
如果(getrlimit(RLIMIT_NOFILE,&fds_limit)==0)max_fd=fds_limit.rlim_cur;

对于(int i=0;i只需通过存储所有服务器套接字来跟踪它们,然后在
fork()
ing之后,将这些
close()
d保存在子节点中

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


更新:

另外,您可能希望使用
setsockopt()
将选项
SO\u REUSEADDR
设置为传递给
bind()

所以!

指示用于验证中提供的地址的规则 bind(2)调用应允许重用本地地址 套接字这意味着套接字可以绑定,除非存在 积极倾听 绑定到地址的套接字。当侦听套接字绑定到具有特定端口的INADR\U ANY时,则无法 为任何本地地址绑定到此端口。参数为整数 布尔标志


只需通过存储所有服务器套接字来跟踪它们,然后在
fork()
ing之后,将这些
close()
d放在子节点中

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


更新:

另外,您可能希望使用
setsockopt()
将选项
SO\u REUSEADDR
设置为传递给
bind()

所以!

指示用于验证中提供的地址的规则 bind(2)调用应允许重用本地地址 套接字这意味着套接字可以绑定,除非存在 积极倾听 绑定到地址的套接字。当侦听套接字绑定到具有特定端口的INADR\U ANY时,则无法 为任何本地地址绑定到此端口。参数为整数 布尔标志



你不认为
关闭所有非标准的fds();
可以这样做吗?@Mihran Hovsepyan:是的,但该函数应该只关闭现有的fds。@MihranHovsepyan可能,可能不是。如果“侦听套接字”实际上被设置为stdin(这对于从inetd启动的服务器来说尤其如此)。或者可能getrlimit调用失败,并且没有关闭所有句柄-只有前1024个。@NikB.Listening套接字没有设置为stdin,而且我检查了getrlimit是否工作正常。您不认为
close_all_none standard_fds()
这样做?@Mihran Hovsepyan:是的,但该功能应该只关闭现有的fds。@MihranHovsepyan可能,可能不是。如果“侦听套接字”实际设置为stdin(这对于从inetd启动的服务器来说尤其如此),该怎么办。或者getrlimit调用失败,并且没有关闭所有句柄-只有前1024个。@NikB.Listening套接字没有设置为stdin,并且我检查了getrlimit是否工作正常。您如何知道子进程正在侦听端口?顺便说一句,您无法关闭不存在的fd。这就是您的服务器崩溃的最可能原因…@Sdra,of c当然可以。您将在errno中获得EBADF。@DietrichEpp使用[netstat-ap | grep]你确定在套接字超时之前没有看到父进程的pid吗?你怎么知道子进程正在侦听端口?顺便说一句,你不能关闭一个不存在的fd。这就是你的服务器崩溃的最可能原因…@Sdra,当然可以。你会在errno中得到EBADF。@DietrichEpp使用[netstat-ap|grep]您确定在套接字超时之前没有看到父级的pid吗?