通常在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计划获取灵感.