你可以用
ptrace(2)
为了实现这一点。它允许您监视流程,并在发生某些事件时得到通知。出于您的目的,请查看
PTRACE_SYSCALL
它允许您在进入和退出syscall时停止进程。
ptrace
操作时,父进程监视子进程,而就子进程而言,它不知道监视事件发生的时间。话虽如此,您应该能够按照以下思路做一些事情:
-
设置ptrace父级和子级,监控(至少)
PTRACE_系统调用
.
-
子进程执行系统调用;并通知家长。
-
PTRACE_GETREGS
和
PTRACE_SETREGS
更改子状态,而不是调用syscall;子进程调用“内存取消保护”例程。
-
孩子不保护自己的记忆;然后提出
SIGUSR1
或者类似于告诉控制父级内存工作已完成。
-
父母捕获
SIGUSR
,使用
PTRACE_SETREGS
恢复先前保存的系统调用信息并恢复子系统。
-
子系统恢复并执行原始系统调用。