我正在使用fork函数创建一个子进程,我想以一种方式编辑它,无论何时调用它都应该打印是否创建进程,(我这样做只是为了练习,我知道这是没用的。)
我研究过的是fork函数是在linux / kernel中名为fork.c的文件中定义的。我不知道我的ubuntu操作系统中这个文件夹在哪里,如果我以某种方式访问fork.c那么操作系统是否允许我编辑?
我还读过,为此我必须下载另一个内核,然后用令人不安的原始内容编辑下载的内核(这很令人头痛)。
我只想以一种在创建进程时打印的方式编辑fork.c。
Plzz忽略了我所说过的任何无用的东西,如果你能给我答案来修改fork.c然后再使用它会很棒。
答案 0 :(得分:2)
因此Linux有一个有用的技巧,你可以用远更简单的方式来做到这一点。它被称为LD_PRELOAD
。
使用这个技巧,我们可以创建一个共享库,我们将其注入另一个进程。此共享库将能够在调用fork()
之前和之后运行代码。
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dlfcn.h>
static pid_t (*real_fork)(void);
pid_t fork(void)
{
printf("Fork is called\n");
if (real_fork == NULL)
real_fork = (pid_t (*)(void))dlsym( RTLD_NEXT, "fork" );
return real_fork();
}
#include <unistd.h>
int main() {
fork();
fork();
return 0;
}
[10:19am][wlynch@apple preload] gcc -Wall test.c -o test
[10:19am][wlynch@apple preload] gcc -shared -ldl -fPIC fork.c -o fork.so
[10:20am][wlynch@apple preload] ./test
[10:20am][wlynch@apple preload] env LD_PRELOAD=/tmp/preload/fork.so ./test
Fork is called
Fork is called
Fork is called