社区
C++ 语言 帖子详情 如何在终止父进程的时候杀死相关的子进程 apexMing 2013-06-07 01:32:39 需要同时实现linux和windows版本。
----------------------------------------------------
* On Linux, it calls "kill(pid, SIGKILL);"
* On Windows, it calls "TerminateProcess(pid->hProcess, 0xf291);"
----------------------------------------------------
在linux下边主进程通过调用"kill(pid, SIGKILL);"被killed 掉,这时候需要结束相关子进程;windows下边用的是“TerminateProcess(pid->hProcess, 0xf291);"。
请问父进程被结束的时候怎样kill相关的子进程呢?所有的。
...全文
638 9 打赏 收藏 如何在终止父进程的时候杀死相关的子进程 需要同时实现linux和windows版本。 ---------------------------------------------------- * On Linux, it calls "kill(pid, SIGKILL);" * On Windows, it calls "TerminateProcess(pid->hProcess, 0xf291);" ---------------------------------------------------- 在linux下边主进程通 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 9 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 apexMing 2013-07-02 打赏举报 回复 引用 8 楼 luciferisnotsatan 的回复:IDE不是你们开发的?它用了TerminateProcess直接干掉你们开发的app1?
那么你们app1起来个,再创建个守护进程guard1。app1里,可以在起了子进程后,把子进程id传给guard1。guard1定期检查app1是否挂了,挂了就把子进程都干了,然后自刎。
恩,是个方法。 luciferisnotsatan 2013-06-08 打赏举报 回复 IDE不是你们开发的?它用了TerminateProcess直接干掉你们开发的app1?
那么你们app1起来个,再创建个守护进程guard1。app1里,可以在起了子进程后,把子进程id传给guard1。guard1定期检查app1是否挂了,挂了就把子进程都干了,然后自刎。 apexMing 2013-06-08 打赏举报 回复 引用 1 楼 qq120848369 的回复:你再说什么...
为什么不定义优雅退出的信号处理或者管道通知, 非得kill -9。
kill -9完了忘记wait。
关键是IDE在windows下边用TerminateProcess()函数去终止父进程了。而TerminateProcess()函数执行后,被终止的进程是不会得到任何关于程序退出的通知的。也就是说,被终止的进程是无法在结束运行前进行退出前的收尾工作的。所以,通常只有在其他任何方法都无法迫使进程退出时才会考虑使用TerminateProcess()去强制结束进程。
这个时候怎么用优雅退出的信号处理或者管道通知子进程呢? luciferisnotsatan 2013-06-08 打赏举报 回复 引用 5 楼 luqichao 的回复:[quote=引用 3 楼 luciferisnotsatan 的回复:]
linux里好像可以用 pkill -P ppid 杀死子进程
问题是这样的。
一个独立的app1集成到IDE下边,在IDE下边有按钮可以终止app1。这个app1是多线程的,在其一的子进程中会调用另外一个app2。现在需要在终止app1的时候能停止app2的运行。在windows下,IDE调用TerminateProcess终止app1,在linux下边通过发送SIGKILL signal终止app1。
怎样终止app2呢?[/quote]
直接system函数发命令不就行了,为什么一定要用TerminateProcess?如果一定要这么做,而且app1也没记录app2的pid,那就CreateToolhelp32Snapshot做个快照,然后遍历进程,用NtQueryInformationProcess得到父进程id(http://bbs.csdn.net/topics/390226903),把祖先是app1的进程都用TerminateProcess终止就可以了。 apexMing 2013-06-08 打赏举报 回复 引用 3 楼 luciferisnotsatan 的回复:linux里好像可以用 pkill -P ppid 杀死子进程
问题是这样的。
一个独立的app1集成到IDE下边,在IDE下边有按钮可以终止app1。这个app1是多线程的,在其一的子进程中会调用另外一个app2。现在需要在终止app1的时候能停止app2的运行。在windows下,IDE调用TerminateProcess终止app1,在linux下边通过发送SIGKILL signal终止app1。
怎样终止app2呢? apexMing 2013-06-08 打赏举报 回复 引用 1 楼 qq120848369 的回复:你再说什么...
为什么不定义优雅退出的信号处理或者管道通知, 非得kill -9。
kill -9完了忘记wait。
问题是这样的。
一个独立的app1集成到IDE下边,在IDE下边有按钮可以终止app1。这个app1是多线程的,在其一的子进程中会调用另外一个app2。现在需要在终止app1的时候能停止app2的运行。在windows下,IDE调用TerminateProcess终止app1,在linux下边通过发送SIGKILL signal终止app1。
怎样终止app2呢? luciferisnotsatan 2013-06-07 打赏举报 回复 linux里好像可以用 pkill -P ppid 杀死子进程 luciferisnotsatan 2013-06-07 打赏举报 回复 windows里 taskkill /T 参数 qq120848369 2013-06-07 打赏举报 回复 你再说什么...
为什么不定义优雅退出的信号处理或者管道通知, 非得kill -9。
kill -9完了忘记wait。 linux下的进程管理演示(c语言) 进程的创建和控制
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。每个进程在屏幕上显示一个字符,记录屏幕上的显示结果,并分析原因。修改以编写的程序,将每个进程输出一个字符改为每个进程输出一句话。
进程的软中断通信
使用系统调用fork()创建两个子进程,使用系统调用
signal()让父进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出子进程被杀死信息后终止,父进程等待两个子进程终止后,输出父进程被杀死信息后终止程序。记录屏幕上的显示结果,并分析原因。
进程的管道通信
使用系统调用pipe()建立一个管道;两个子进程分别向管道写信息,父进程则从管道读出来自子进程的信息,显示在屏幕上。
记录屏幕上的显示结果,并分析原因。 进程管理 进程的软中断通信 使用系统调用fork()创建两个子进程,使用系统调用signal()让进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出子进程被杀死信息后终止,父进程等待两个子进程终止后,输出父进程被杀死信息后终止程序。记录屏幕显示结果,并分析原因。 内附ubuntu下调试成功的代码 杀死父进程,其子进程通常不会自动终止(kill父进程)孤儿进程(kill process tree、pkill -P、杀死进程树、kill进程树) 操作系统为每个进程分配独立的资源(如内存、文件句柄等),并赋予其独立的生命周期。即使父进程被终止,子进程仍可能继续运行,因为它们并不依赖父进程的存在。),子进程结束后会变成“僵尸进程”(Zombie Process)。虽然僵尸进程本身不占用资源,但它们会占用进程表项,可能导致系统无法创建新进程。某些服务(如 Web 服务器、数据库)可能通过父进程启动多个子进程处理请求。仅终止父进程可能留下运行中的子进程,导致服务未完全关闭,干扰后续操作。如果仅终止父进程,子进程仍可能继续运行,导致资源浪费或系统性能下降。 关于linux:当父进程被’kill -9’杀死时,如何终止子进程 父级一旦通过SIGKILL杀死,将停止存在,因此无法再向其子级进程发送信号。当父项被杀死时,PPID更改为1-这可能有助于客户端对被杀死的父项采取行动。但是"确保子进程始终与父进程一起关闭"是不可能的,这是SIGKILL的本质。但是,如果您觉得自己很勇敢,可以随时修改源代码并将SIGKILL重新定义为其他内容,但是我不建议这样做:)不,这不是我期望的答案。作为Linux应用程序开发人员,无论用户如何终止父进程,我们都应确保子进程始终被父进程关闭。kill -9将向父进程发送SIGKILL信号。 Linux子进程通过“信号”终止父进程 请注意,这种方法通常不被推荐,因为它违反了操作系统提供的父子进程之间的正常信号流程。在实际应用中,应当尽量避免子进程影响父进程的执行。如果确实需要进行通信或协调,应使用更安全的机制,如管道(pipe)、命名管道(FIFO)、信号量、消息队列或者套接字等。命令发送特定的信号给父进程。如果子进程在其终止处理程序(命令,并且指定父进程的进程ID,那么父进程就可以被终止。信号,父进程注册了这个信号的处理程序,在其中终止自己。在这个例子中,子进程在5秒后向父进程发送了一个。
C++ 语言
65,195
社区成员
250,524
社区内容
发帖 与我相关 我的任务 C++ 语言 C++ 语言相关问题讨论,技术干货分享,前沿动态等 复制链接
扫一扫 分享 确定 社区描述 C++ 语言相关问题讨论,技术干货分享,前沿动态等 c++ 技术论坛(原bbs) 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子请不要发布与技术无关的招聘、广告的帖子请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章