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吗?