[英]C++ : fork/exec or pthread?
我正在编写一个程序,一旦按下按钮,我就必须执行一个服务器进程(只有在我决定杀死他时才会停止)。
为了执行这个过程,我决定使用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
标志。
我的猜测是某些库使用的某些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);
您可以在此处详细了解此问题。
在对execv
, argv
必须由空指针终止。 上一行应该是:
char* argv[] = { "./Server", str, NULL };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.