python 杀死子进程_Python:当父异常终止时,如何杀死子进程?

小编典典

呵呵,我昨天自己在研究这个!假设您无法更改子程序:

在Linux上,prctl(PR_SET_PDEATHSIG,...)可能是唯一可靠的选择。(如果绝对有必要终止子进程,那么您可能希望将终止信号设置为SIGKILL而不是SIGTERM;链接到的代码使用SIGTERM,但是子级确实可以选择忽略SIGTERM。

在Windows上,最可靠的选择是使用Job对象。想法是创建一个“作业”(一种用于流程的容器),然后将子流程放入作业中,并设置魔术选项,指出“当没有人握住该作业的“手柄”时,然后杀死其中的进程”。默认情况下,作业的唯一“句柄”是父进程持有的句柄,并且当父进程死掉时,操作系统将遍历并关闭其所有句柄,然后注意这意味着没有用于工作。因此,它会按要求杀死孩子。包含使用该win32api模块执行此操作的示例代码。该代码使用CreateProcess发射子,而不是subprocess.Popen。原因是他们需要为生成的子项获取一个“进程句柄”,并CreateProcess默认将其返回。如果您愿意使用subprocess.Popen,那么这是该答案中代码的(未经测试的)副本,它使用subprocess.Popen和OpenProcess代替CreateProcess:

import subprocess

import win32api

import win32con

import win32job

hJob = win32job.CreateJobObject(None, "")

extended_info = win32job.QueryInformationJobObject(hJob, win32job.JobObjectExtendedLimitInformation)

extended_info['BasicLimitInformation']['LimitFlags'] = win32job.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE

win32job.SetInformationJobObject(hJob, win32job.JobObjectExtendedLimitInformation, extended_info)

child = subprocess.Popen(...)

# Convert process id to process handle:

perms = win32con.PROCESS_TERMINATE | win32con.PROCESS_SET_QUOTA

hProcess = win32api.OpenProcess(perms, False, child.pid)

win32job.AssignProcessToJobObject(hJob, hProcess)

从技术上讲,这里有一个很小的比赛条件,以防孩子在Popen和OpenProcess呼叫之间死亡,您可以决定是否要担心这一点。

使用作业对象的一个​​缺点是,在Vista或Win7上运行时,如果从Windows

Shell启动程序(即,通过单击图标),则可能已经分配了一个作业对象并尝试创建一个作业对象。新的作业对象将失败。Win8可以解决此问题(通过允许嵌套作业对象),或者如果您的程序是从命令行运行的,那么应该可以。

如果您 可以

修改子级(例如,像使用时一样multiprocessing),那么最好的选择可能是以某种方式将父级的PID传递给子级(例如,作为命令行参数,或者在的args=参数中multiprocessing.Process),然后:

在POSIX上:在子级中生成一个os.getppid()偶尔会调用的线程,如果返回值停止匹配从父级传入的pid,则调用os._exit()。(这种方法可移植到包括OS

X在内的所有Unix上,而prctl窍门是特定于Linux的。)

在Windows上:在使用OpenProcess和的子代中产生一个线程os.waitpid。使用ctypes的示例:

from ctypes import WinDLL, WinError

from ctypes.wintypes import DWORD, BOOL, HANDLE

# Magic value from http://msdn.microsoft.com/en-us/library/ms684880.aspx

SYNCHRONIZE = 0x00100000

kernel32 = WinDLL("kernel32.dll")

kernel32.OpenProcess.argtypes = (DWORD, BOOL, DWORD)

kernel32.OpenProcess.restype = HANDLE

parent_handle = kernel32.OpenProcess(SYNCHRONIZE, False, parent_pid)

# Block until parent exits

os.waitpid(parent_handle, 0)

os._exit(0)

这避免了我提到的作业对象的任何可能的问题。

如果您想真正确定,那么可以组合所有这些解决方案。

希望有帮助!

2020-06-02

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html评论置顶功能,微信公众号精选留言评论怎么置顶显示?功能在哪里设置?...

微信公众号精选留言怎么置顶?微信公众号留言功能新增了置顶精选留言的设置,那么微信公众号留言功能在哪里设置呢?下文小乐哥给大家介绍一下!微信公众号精选留言怎么置顶?微信公众平台悄然上线了一个新功能,…

python函数增强代码可读性_写Python必须知道的这几个代码技巧!你会吗?

Day09 函数的初始 函数:函数是以功能为导向,一个函数封装一个功能。登录,注册,文件的改的操作。。。 函数减少代码的重复性,增强了代码的可读性; 获取任意一个字符串的元素的个数 s1 "xiaomingxiaoho…

shell脚本发邮件内容html,[转]Shell脚本中发送html邮件的方法

作为运维人员,免不了要编写一些监控脚本,并将监控结果及时的发送出来。那么通过邮件发送是比较常用的一种通知方式了。通常的,如果需要发送的内容是简单的文本文件,那么使用/bin/mailx就可以了,但是如果想要发送更复杂…

learn python app v3_‎App Store 上的“Learn Python and Scratch”

Learn “Python and Scratch Programming” from AI driven coach and satisfy your thirst for knowledge. App offers bite sized videos, quizzes and AI driven coach to help you become smarter and become great. Just 60 minutes a week can help you become great in …

计算机应用基础知识竞赛题,计算机基础知识题库

随着科学技术的进步,计算机已逐渐渗入人们的生活中,相应的计算机知识是需要具备的,那么你对计算机基础知识了解多少呢?以下是由学习啦小编整理关于计算机基础知识题库的内容,希望大家喜欢!计算机基础知识题库一、单选题1、 第一台…

inspect python_python之inspect模块

inspect模块主要提供了四种用处: 1.对是否是模块、框架、函数进行类型检查 2.获取源码 3.获取类或者函数的参数信息 4.解析堆栈 一、type and members 1. inspect.getmembers(object[, predicate]) 第二个参数通常可以根据需要调用如下16个方法; 返回值为…

HTML打开网页拒绝访问,192.168.1.1拒绝访问怎么办?

问:为什么设置路由器时,在浏览器中输入192.168.1.1,结果显示拒绝访问,这个问题怎么解决?答:如果是在设置路由器的时候,登录192.168.1.1被拒绝访问,多半是你自己操作有问题导致的&…

python中goto的用法_python3里用goto

python里用goto也是小Pa最近做的项目里的一个需求。python不像C有自带的goto, 需要用额外的包,目前为止,小pa只看到2个goto的包: 这2个小Pa都下载试用过,goto因为开发的时候比较早,对于python3的支持不太好,不推荐使用…

delphi打印html文件路径,Delphi获取文件名、不带扩展名文件名、文件所在路径、上级文件夹路径的方法...

1.获取不带扩展名的文件名方法,利用ChangeFileExt函数修改传入参数的扩展为空,并不会对文件本身产生变更。ChangeFileExt(ExtractFileName(‘D:\KK\Test\123.txt‘),‘‘); //返回 1232.获取上级文件夹路径的方法。ExtractFileDir(‘D:\KK\Test\‘)‘..‘…

gitlab git clone 输入密码_gitlab1:部署gitlab

1、配置yum源vim /etc/yum.repos.d/gitlab-ce.repo复制以下内容:[gitlab-ce]nameGitlab CE Repositorybaseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/gpgcheck0enabled12、更新本地yum缓存sudo yum makecache3、安装GitLab社区版sudo y…

计算机专业英语第五章ppt,计算机专业英语第五章.ppt

计算机专业英语第五章Background The Internet protocols are the worlds most popular open-system (nonproprietary) protocol suite because they can be used to communicate across any set of interconnected networks and are equally well suited for LAN and WAN comm…

python播放在线音乐_Python实现在线音乐播放器

最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目,使用Python的库Tkinsert做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过re…

golang如何打印float64的整数部分_2020-08-10:如何不用加减乘除求浮点数的2倍值?...

福哥答案2020-08-10:浮点数符号位阶码尾数,阶码加1就是浮点数的2倍值。代码用golang编写,如下:package test33_addimport ( "fmt" "math" "testing")/*//https://www.bbsmax.com/A/6pdDX7…

五年级数学上册用计算机探索规律,人教版小学五年级数学上册《用计算器探索规律》课后反思...

当前,新课程改革强调学生学习方式的转变.高效课堂是课程改革过程中有效学习方式之一.在高效课堂中,孩子们能发挥自己潜能、展示自己的才能,提高了孩子们的学习兴趣.如何让高效课堂焕发光彩能?一、合理分组,恰当分工合理分组是高效课堂顺利进行的前提.在以前的学习过…

mysql varchar 非空判断_工资从1万到3万,你还差mysql数据库优化之系列三

查询性能的优化优化查询分析的步骤:1.应用查询是否检索超过需要的数据2.mysql服务器是否在分析超过需要的数据正确使用索引:1.like语句操作一般不使用%或_开头例如: select * from tableName where name like %cn;只能使用like aaa%;2.组合索引例如索引index index_name (a, b,…

etl数据抽取工具_数据同步工具ETL、ELT傻傻分不清楚?3分钟看懂两者区别

什么是数据同步工具(ETL、ELT)数据同步工具ETL或者ELT的作用是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。数据同步是大数据项目重要的一个环节。…

浙江等高等学校计算机,2010年浙江省高等学校计算机等级考试

2010年上半年浙江省高等学校计算机等级考试二级C程序设计试卷一、程序阅读与填空(24小题,每小题3分同,共72分)1.阅读下列程序说明和程序,在每小题提供的若干可选答案中,挑选一个正确答案。【程序说明】输入一个正整数&…

oracle数据库查表_Oracle面试问题-技术篇

这也许是你一直期待的文章,在关注这部分技术问题的同时,请务必阅读有关面试中有关个人的问题和解答。和猎萝卜小编来一起了解。这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽…

uniapp怎么调起摄像头拍视频_抖音视频怎么拍?我们总结了10个手机视频拍摄小技巧...

抖音的很多功能与小咖秀类似,但不同的是,抖音用户可以通过视频拍摄的快慢、视频编辑和特效等技术让作品更具创造性,而不是简单地对嘴型。抖音短视频的10个拍摄技巧,帮助你方便、快捷地制作出更加优质的短视频内容。1.远程控制暂停更方便抖音视频怎么拍?在拍摄时,如果…

计算机的两个基本能力是存储程序,【2012年职称计算机模拟题(55)】- 环球网校...

15.简述计算机的存储程序原理$lesson$答:计算机的工作方式取决于它的两个基本能力,A.是能够存储程序;B.是能够自动执行程序。计算机利用存储器(内存)来存放所要执行的程序,而CPU可以依次从存储器中取出程序的每一条指令,并加以分析…