如何在C++中杀死一个分叉进程
How can I kill a forked process in C++?
我正在开发一款游戏,所以有一次我不得不使用fork()
,主线程运行opengl图形,子线程运行游戏逻辑。
现在我有个问题。在某个时刻,用户可能会在游戏中按下"退出"按钮,该按钮由次要线程处理。此外,在某个时刻,用户可以单击X按钮退出由主(供过于求)线程处理的游戏。所以我的问题是:如何杀死另一个正在运行的线程,然后退出?
现在,如果我关闭窗口,第二个线程将继续运行,如果第二个螺纹完成,第一个螺纹将继续运行。
使用atexit
功能可以处理"X"按钮,但我还没有找到杀死glutMainLoop()
的(安全)方法。
如果您实际上正在调用fork()
(而不是启动一个新线程),那么您实际上正在创建另一个正在运行的进程。当调用fork()
时,它会向父进程返回一个进程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)很难杀死它。
请准确描述thread
和process
,因为它们描述了不同的主题。
由于您使用了fork()
,所以您实际上是在处理流程。我建议您改用threads
,因为它的内存效率更高(因为程序只需要在内存中一次),而且更容易处理。当然,你必须自己处理关键部分。
下面是一个使用线程的好例子。
如果您坚持使用进程和fork()
,您仍然可以发送信号并实现特定的信号处理程序。我也读过一些关于IPC(进程间通信)的文章,比如http://tldp.org/LDP/lpg/node7.html.
相关文章:
- 如何在C++中将函数发送到另一个进程
- 如何从另一个进程解开全局钩子?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 为什么一个进程会挂在RtlExitUserProcess/LdrpDrainWorkQueue中?
- 先进先出:一个进程永远不会从管道读取
- 如何在MPI中将矩阵从一个进程转移到另一个进程
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 带有 QSharedMemory 的 IPC,如果其中一个进程挂起,则存在风险
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- 如何:监视Windows中另一个进程的文件访问?
- 是否可以注入一个进程并获取给定的句柄,然后使用它们注入另一个进程
- 尝试启动另一个进程并通过 MPI 加入它,但获得访问冲突
- 将窗口句柄从一个进程使用到另一个进程(插件 vst 音频)
- 启动另一个进程的最佳方式C++?
- 在 Linux 下的 Qt,如何检测一个进程已经在运行
- 当一个进程截断 Boost 进程间库创建的共享内存时,进程需要重新映射
- Win32/Gdigrab - 如何将另一个进程窗口设置为无边框
- 为什么我不能用这个函数在Qt框架中打开另一个进程?
- 创建一个进程,指定要在其上运行的 NUMA 节点
- 多次运行程序,同时保留一个进程