C++ : fork/exec or pthread?

标签 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 吗?我是不是做了什么坏事?

谢谢,
伊奥

最佳答案

当您执行 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/

相关文章:

c++ - 构造函数中的 Lambda

c - pthreads : allowed number of threads

execvpe 函数的编译器警告

python - 使用带有格式化字符串的Python exec() 函数?

c# - 为控制台应用程序制作 UI

c++ - 如何为 QWebEngineView 设置 OffTheRecord 配置文件?

C++ 避免在使用 boost::weak_ptr 的成员函数中过度使用 lock()

c - 如果 pthread 条件变量收到信号但互斥体被锁定,会发生什么情况?

c++ - Linux pthreads 上的 gcc 4.7 - 使用 __thread 的重要 thread_local 解决方法(无提升)

java - 从java代码获取cmd命令的输出