如何在C ++中杀死分叉进程?

时间:2012-03-01 16:52:49

标签: c++ multithreading opengl fork

我正在开发游戏,所以有一点我不得不使用fork(),主线程运行opengl图形,子线程运行游戏逻辑。

现在我遇到了问题。在某些时候,用户可以按下游戏内的“退出”按钮,该按钮由辅助线程处理。此外,在某些时候,用户可以点击X按钮退出由主(过剩)线程处理的游戏。所以这是我的问题:如何杀死其他正在运行的线程,并退出?

现在,如果我关闭窗口,第二个线程继续运行,如果第二个线程完成,第一个线程继续运行。

使用atexit功能可以处理“X”按钮,但我还没有找到(安全)杀死glutMainLoop()的方法。

2 个答案:

答案 0 :(得分:1)

如果您实际上正在调用fork()(而不是启动新线程),那么您实际上正在创建另一个正在运行的进程。调用fork()时,它会将process-id返回给父进程。这可以传递给kill()来杀死进程。在linux下,这看起来像:

#include <signal.h>

pid_t pid = fork();
if (pid == 0) {
   // you are in the child process
} else if (pid > 0) {
   // you are in the parent process
   ...
   // send a termination signal
   kill(pid, SIGTERM);
} else {
   // fork had an error which should be logged...
}

您需要选择发送进程的信号。例如,SIGKILL(9)很难杀死它。

答案 1 :(得分:0)

请准确了解threadprocess,因为它们描述了不同的主题。

由于您使用fork(),因此您实际上正在处理流程。我建议你改用threads,因为它的内存效率要高得多(因为程序只需要在内存中一次)并且更容易处理。当然,你必须自己处理关键部分。

Here是使用线程的一个很好的例子。

如果您坚持使用流程和fork(),您仍然可以发送信号并实施特定的信号处理程序。我还阅读了一些关于IPC(进程间通信)的文章,如http://tldp.org/LDP/lpg/node7.html