gpt4 book ai didi

C++ : fork/exec or pthread?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:35 24 4
gpt4 key购买 nike

我正在编写一个程序,一旦按下一个按钮,我就必须执行一个服务器进程(只有当我决定杀死他时才会停止)。
为了执行这个过程,我决定使用 fork/execv 机制:

void Command::RunServer() {

pid = fork();

if (pid==0) {
chdir("./bin");
char str[10];
sprintf(str,"%d",port);
char *argv[] = {"./Server", str};
execv("./Server",argv);
}
else {
config->pid = pid;
return;
}
}

在“按下按钮”方法中,我这样做:

command->RunServer();

几天前它似乎工作得很好......现在我得到错误:

main: xcb_io.c:221: poll_for_event: Assertion `(((long) (event_sequence) - (long) (dpy->request)) <= 0)' failed.

我应该尝试切换到 pthread 吗?我是不是做了什么坏事?

谢谢,
伊奥

最佳答案

当您执行 fork() 时,您进程的所有文件描述符都将复制到新进程中。当您执行 exec*() 时,所有文件描述符也会保留,除非它们标有标志 FD_CLOEXEC

我的猜测是某些库(可能是 Xlib)使用的某些 fd 被新进程继承,并且重复导致程序困惑。

在这些情况下,如果您想保持标准 I/O 打开,BSD 函数 closefrom() (closefrom(3)) 很有用。不幸的是,在 linux 中没有这样的功能,所以你必须做一个 close-all 循环或类似的 cruft:

int open_max = sysconf (_SC_OPEN_MAX);
for (int i = 3; i < open_max; i++)
close(i);

您可以阅读有关此问题的更多信息 here .

关于C++ : fork/exec or pthread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556245/

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