码迷,mamicode.com
首页 > 系统相关 > 详细

Unix系统编程()检查进程的存在

时间:2018-03-30 21:55:19      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:僵尸   关闭   进程id   情况   成功   表示   写入   指定   打开文件   


检查进程的存在

kill系统调用还有另一重功用。若将参数sig指定为0(即所谓空信号),则无信号发送。

相反,kill仅会去执行错误检查,查看是否可以向目标进程发送信号。

从另一角度来看,这意味着,可以使用空信号来检测具有特定进程ID的进程是否存在。若发送空信号失败,且errno为ESRCH,则表明目标进程不存在。如果调用失败,且errno为EPERM(表示进程存在,但无权向目标进程发送信号)或者调用成功(有权向进程发送信号),那么就表示进程存在。

验证一个特定进程ID的存在并不能保证特定程序仍在运行。因为内核会随着进程的生灭而循环使用进程ID。而一段时间之后,同一进程ID所指恐怕是另一进程了。此外,特定进程ID可能存在,但是是一个僵尸(亦即,进程已死,但其父进程尚未执行wait来获取其终止状态)。


还可以使用各种其他技术来检查某一特定进程是否正在运行,其中包括如下技术。

wait系统调用:仅用于监控调用者的子进程。

信号量和排他文件锁:如果进程持续持有某一信号量或文件锁,并且一直处于被监控状态,那么能获取到信号量或锁时,即表明该进程已经终止。

诸如管道和FIFO之类的IPC通道:可对监控目标进程进行设置,令其在自身生命周期内持有对通道进行写操作的打开文件描述符。同时,令监控进程持有针对通道进行读操作的打开文件描述符,且当通道写入端关闭时(遭遇文件结束符),即可获知监控目标进程已经终止。监控进程对此情况的判定,既可借助对自身文件描述符的读取,也可以采用后面的描述符监控技术之一。

/proc/PID接口:例如,如果进程ID为12345的进程存在,那么目录/proc/12345将存在,可以发起诸如stat之类的调用来进行检查。

除去最后一项之外,循环使用进程ID不会影响上述所有技术。

Unix系统编程()检查进程的存在

标签:僵尸   关闭   进程id   情况   成功   表示   写入   指定   打开文件   

原文地址:https://www.cnblogs.com/tuhooo/p/8678022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!