gpt4 book ai didi

c++ - fork 进程一直监听服务器的端口

转载 作者:太空宇宙 更新时间:2023-11-04 03:59:47 26 4
gpt4 key购买 nike

这是我执行命令的代码的精简版:

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 方法在我的服务器端应用程序中用于运行不同类型的进程,包括守护进程。但是在这里我注意到一个问题:

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

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

最佳答案

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

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


更新:

您可能还想使用 setsockopt() 将选项 SO_REUSEADDR 设置为传递给 bind()

的套接字

SO_REUSEADDR

Indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses. For AF_INET sockets this means that a socket may bind, except when there is an active listening socket bound to the address. When the listening socket is bound to INADDR_ANY with a specific port then it is not possible to bind to this port for any local address. Argument is an integer boolean flag.

关于c++ - fork 进程一直监听服务器的端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13125758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com