gpt4 book ai didi

c++ ServerSocket()、FD_CLOEXEC、fork() 和 execl()

转载 作者:行者123 更新时间:2023-11-30 04:30:09 24 4
gpt4 key购买 nike

我在尝试在我的应用程序中执行命令时遇到问题,所以我是 told here双叉并清除一些设置,所以这是我的结果:

if((pid = fork()) < 0)
perror("Error with Fork()");
else if(pid > 0) {
return "";
}
if (setsid()==-1) {
Log("failed to become a session leader");
}

if (chdir("/") == -1) {
Log("failed to change working directory");
}

umask(0);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
if (open("/dev/null",O_RDONLY) == -1) {
Log("failed to reopen stdin");
}
if (open("/dev/null",O_WRONLY) == -1) {
Log("failed to reopen stdout");
}
if (open("/dev/null",O_RDWR) == -1) {
Log("failed to reopen stderr");
}

signal(SIGHUP, SIG_IGN);
Log("No return, forking..");
if((pid = fork()) < 0)
perror("Error with Fork()");
else if(pid > 0) {
return "";
} else {
if(execl("/bin/bash", "/bin/bash", "-c", cmddo, (char*) 0) < 0) perror("execl()");
exit(0);
}

双 fork 解决了 execl'd proc 在其父级关闭时停止的问题,但它让我的 execl'd 进程保持在父级套接字上,因此当父级试图再次启动时它不能。

这是我的父套接字内容:

ServerSocket server(listenport);
while(true)
{
ServerSocket* new_sock = new ServerSocket();

server.accept (*new_sock);

pthread_t thread;
int rc = pthread_create(&thread, NULL, &LoadThread, (void*)(new_sock));

if (rc) Log_warn("Fatal Error: pthread_create() #%d", rc);
pthread_detach(thread);
}

我在上一个问题中被告知要在套接字上使用 FD_CLOEXEC,但我不明白该怎么做 - 谷歌(加上堆栈)在这方面没有给我太多帮助。

我如何在我的 ServerSocket() 上执行 FD_CLOEXEC,以便当我 fork/execl 一个子进程时它不会挂起我的套接字?

谢谢:D

回答:如下所述清除 fd - 我的代码实际上有这个,它对我有用:

struct rlimit       rl;
int i;

if (rl.rlim_max == RLIM_INFINITY)
rl.rlim_max = 1024;

for (i = 0; (unsigned) i < rl.rlim_max; i++)
close(i);

最佳答案

FD_CLOEXEC 是一个可以在文件描述符上设置的标志 -- 它的作用是当持有句柄的进程调用 exec() 时,描述符被关闭.

使用

fcntl(fd, F_SETFD, (long)FD_CLOEXEC);

设置标志;为此,您需要访问实际的文件描述符。

此外,setsid() 完全足以将您与父进程组分离,虽然双 fork() 也有效,但它不会为您赢得加分与嵌入式人员。

最后,不能保证在关闭前三个文件描述符后,下一个打开的文件描述符就是这三个;最好用

fd newstdin = open(...);
if(dup2(newstdin, STDIN_FILENO) != 0) { /* handle error */ }
close(newstdin);

关于c++ ServerSocket()、FD_CLOEXEC、fork() 和 execl(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8898479/

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