C++ : fork/exec or pthread?

C++ : fork/exec or pthread?

本文关键字:or pthread exec fork C++      更新时间:2023-10-16

我正在写一个程序,一旦按下一个按钮,我就必须执行一个服务器进程(只有当我决定杀死他时,这个进程才会停止)
为了执行这个过程,我决定使用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吗?我做了什么坏事吗?

谢谢,
eo

执行fork()时,流程的所有文件描述符都会在新的文件描述符中重复。当执行exec*()时,所有文件描述符也会被保留,除非它们用标志FD_CLOEXEC标记。

我的猜测是,某个库(可能是Xlib)使用的一些fd被新进程继承了,重复会导致程序混乱。

在这些情况下,如果您想保持标准I/O的打开状态,BSD函数closefrom()closefrom(3))非常有用。不幸的是,在linux中没有这样的函数,所以你必须进行一个全封闭循环或类似的cruft:

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

你可以在这里阅读更多关于这个问题的信息。

在对execv的调用中,argv必须由一个空指针终止。前一行应该是:

char* argv[] = { "./Server", str, NULL };