C ++:fork / exec还是pthread?

时间:2012-07-19 07:53:58

标签: c++ pthreads exec fork

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

您可以详细了解此问题here

答案 1 :(得分:3)

在对execv的调用中,argv必须由空指针终止。 上一行应为:

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