C++:fork/exec还是pthread?

eou*_*uti 4 c++ fork pthreads exec

我正在编写一个程序,一旦按下按钮,我就必须执行一个服务器进程(只有在我决定杀死他时才会停止).
为了执行这个过程,我决定使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在方法"按下按钮",我做:

command->RunServer();
Run Code Online (Sandbox Code Playgroud)

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

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

我应该尝试切换到pthread吗?我做了坏事吗?

谢谢,
eo

rod*_*igo 5

当您执行fork()所有文件描述符时,您的进程将在新文件中重复.并且当您执行exec*()所有文件描述符时也会保留,除非它们标有标记FD_CLOEXEC.

我的猜测是某些库使用的某些fd(可能是Xlib)是由新进程继承的,并且复制会导致程序混乱.

在这些情况下,如果要保持标准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);
Run Code Online (Sandbox Code Playgroud)

您可以在此处详细了解此问题.