我们如何注册函数,以便在执行系统调用之前调用它。
例如,pthread_atfork()
注册将在fork()
之前和之后调用的函数。
以下是Linux系统上的示例。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
//http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_atfork.html
void prepare_function() {
printf("%d : In Prepare Function\n", getpid());
}
void parent_fuction() {
printf("%d : In Parent Function\n", getpid());
}
void child_function() {
printf("%d : In Child Function\n", getpid());
}
int main() {
pthread_atfork(prepare_function, parent_fuction, child_function);
if (fork() == 0) {
//sleep(1);
printf("%d : In Child\n", getpid());
return 0;
}
//sleep(1);
printf("%d : In Parent\n", getpid());
return 0;
}
我很好奇如何实现这一点。
答案 0 :(得分:0)
这里的实际目标是什么?
Fork有钩子,因为未定义的线程存在的子状态。因此,通过连接自己,你可以确保你想要使用的任何机制保持可操作性(例如,如果在你的一个线程锁定之后发生了fork,那么锁定将继续在子进程内 - 现在是什么?)。
通常,没有为所有系统调用提供挂钩的机制。
在大多数情况下,系统调用都包含在glibc中,因此几乎没有实际调用内核的入口点。有人厌倦了可以通过例如在生成的代码中插入一个跳转,将执行放入其例程中。但是这样的例程必须有自己的方式来调用系统调用或黑客攻击。
但是等等,任何一段代码都可以在不使用这种包装器的情况下自由调用系统调用,并且可以动态生成这样的代码,因此在执行之前不能对其进行二进制修补。
您可以使用ptrace跟踪系统调用进入/退出,但是您需要一个单独的进程。