我的进程启动了一个进程——以shell为例,但实际上适用于任何进程。我需要在shell创建新进程并获取它们的PID时得到通知。
我可以在任何给定时间拍摄整个进程树(好吧,pstree可以),但如何监视具有给定PID的进程创建新进程呢?
到目前为止,我已经找到了几种方法,在这里 How to monitor an external process for events by its PID in C?,但没有一种真正解决我的问题:
1. 监控NetLink proc接口。问题:需要root权限,我没有。 2. 自定义库覆盖由LD_PRELOAD加载到shell进程中的syscalls。问题:它也会被shell的子进程继承,而我不想要这个——我只想监视shell。 3. ptrace() shell。问题:通知父进程(即我的进程)有关创建新进程的标志,即PTRACE_O_TRACEFORK、PTRACE_O_TRACEVFORK和PTRACE_O_TRACECLONE将ptrace()传递给子进程,而我只想监视shell。 4. 使shell合作。问题:在BASH命令回调中(如undistract-me中使用的),非常hacky。我也更喜欢避免特定于shell的代码。
我觉得我在这里错过了一些简单的东西。我感觉我可以通过更多的黑客方法使上述解决方案之一起作用,但是……我难道不需要使用像LD_PRELOAD和ptrace()这样的大炮来完成这么简单的任务吗?
JFYI我在Vala中编写此代码,但欢迎C片段。
我可以在任何给定时间拍摄整个进程树(好吧,pstree可以),但如何监视具有给定PID的进程创建新进程呢?
到目前为止,我已经找到了几种方法,在这里 How to monitor an external process for events by its PID in C?,但没有一种真正解决我的问题:
1. 监控NetLink proc接口。问题:需要root权限,我没有。 2. 自定义库覆盖由LD_PRELOAD加载到shell进程中的syscalls。问题:它也会被shell的子进程继承,而我不想要这个——我只想监视shell。 3. ptrace() shell。问题:通知父进程(即我的进程)有关创建新进程的标志,即PTRACE_O_TRACEFORK、PTRACE_O_TRACEVFORK和PTRACE_O_TRACECLONE将ptrace()传递给子进程,而我只想监视shell。 4. 使shell合作。问题:在BASH命令回调中(如undistract-me中使用的),非常hacky。我也更喜欢避免特定于shell的代码。
我觉得我在这里错过了一些简单的东西。我感觉我可以通过更多的黑客方法使上述解决方案之一起作用,但是……我难道不需要使用像LD_PRELOAD和ptrace()这样的大炮来完成这么简单的任务吗?
JFYI我在Vala中编写此代码,但欢迎C片段。