检查进程的存在

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不会影响上述所有技术。

最新文章

  1. 谈谈pooling?
  2. cookie 和session 的区别
  3. web系统架构设计中需要知道的点(前端篇)
  4. 64-who 简明笔记
  5. js点击按钮倒计时setTimeout和setInterval
  6. @property和@synthesize的特性
  7. codevs 5429 完全背包
  8. Oracle字符集的查看查询和Oracle字符集的设置修改
  9. Linux软件安装与卸载
  10. 小插曲之变量和字符串 - 零基础入门学习Python003
  11. Chapter 2 Open Book——5
  12. ubuntu下安装opencv库+Python2.7环境安装及开发摄像头拍照应用
  13. 命令模式 Command 行为型 设计模式(十八)
  14. 突破瓶颈,再出发 - PM过程能力成熟度5级
  15. 解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题
  16. [转] Scala Try 与错误处理
  17. SQL SERVER 查看数据库安装时间
  18. python读取xml文件中的坐标点
  19. nginx-exporter安装使用
  20. NPOI 操作笔记

热门文章

  1. Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)
  2. taro 填坑之路(一)taro 项目回顾
  3. AP*更新供应商地点
  4. PHP位运算符(转)
  5. Android 8款开源游戏引擎
  6. JAVA编译器常量
  7. 摘:C++日期时间与字符串间的转换
  8. atoi 和 itoa
  9. SQL Prompt几个快捷键
  10. PHP部分常见算法