linux进程结束提醒,c – 如何在linux下进程结束时收到通知?

通常在Linux上,您无法收到有关非子进程或进程组或会话之外的进程的通知(使用

waitpid(2)或SIGCHLD -see

signal(7)– …).

在某些Linux上,甚至可能不允许您的(非根)进程查询其他进程的存在.

当然,/ proc /(每个进程有一个数字命名的目录,例如/ proc / 1234 /用于pid 1234的过程,见proc(5))你可能会定期扫描(例如readdir(3) …)但你不能已通知(参见inotify(7),对于像/ proc / …这样的伪文件系统不起作用).请注意/ proc /是一个伪文件系统,访问它不涉及任何磁盘IO,所以非常快.

所以你可以做的是使用opendir(3),readdir,closedir(3),sleep(3)在一个循环中每隔几秒扫描/ proc /.顺便说一下,理论上它不是防故障的(原则上,在实践中,内核可能在几秒钟内重用相同的pid),并且可能不会捕获所有短生命进程(例如ls shell命令).

这种/ proc的定期扫描很可能是top(1)实用程序正在进行的操作.您可以通过深入了解顶部的源代码或strace(1)来检查它.

如果您的C代码已经知道某个进程的pid并且只想检查该进程是否存在,那么它可以使用kill(2),信号编号​​为0.

如果您可以更改受监控程序的代码或替换它们(例如,通过包装它们的小C程序),情况就会大不相同;例如你可以用/usr/local/bin / foo-wrapper替换/usr/bin/foo并编写一个foo-wrapper.c,fork-s& exec -s原始/usr/bin/foo然后waitpid(2),最后send(2)或write(2)在某些socket(7)或fifo(7)或pipe(7)上发送一些消息,并在显示器中使用基于poll(2)的event loop.如果你能得到你的监视器分叉的所有程序,那么事情也是不同的(使用waitpid ……).请参阅我的execicar.c计划获取灵感.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值