C++ : fork/exec or pthread?
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
标记。
我的猜测是,某个库(可能是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 };
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 模式"allocate memory or use existing data"
- N-API include an .so or dll
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 在 c++11 中为 pthread 设置调度参数
- 我如何将 OR 与 if 语句一起使用字符串
- 将 if 语句中的字符与 or 进行比较
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- "No such file or directory" C++标头问题
- 处理 std::enable_if<...中谓词的逻辑"OR">
- C++ 虽然语句不适用于字符串和"or"
- pthread只有在线程数量较少时才可以正常工作
- C++ : fork/exec or pthread?