我正在使用创建子进程的 fork 函数,我想以一种方式编辑它,无论何时调用它,它都应该打印进程是否已创建,(我这样做只是为了练习,我知道这是没有用的)。
我研究的是,fork 函数是在 linux/kernel 中名为 fork.c 的文件中定义的。我不知道我的 ubuntu 操作系统中的这个文件夹在哪里,如果我以某种方式访问 fork.c 那么操作系统是否允许我编辑?
我还读到,为此我必须下载另一个内核,然后用令人不安的原始版本编辑下载的内核(这很让人头疼)。
我只想以打印进程是否创建的方式编辑 fork.c。
请忽略我说的那些没用的东西,如果你能在步骤中给出修改fork.c然后使用它的答案就太好了。
最佳答案
因此 Linux 有一个有用的技巧,您可以使用它以远更简单的方式完成此操作。它叫做LD_PRELOAD
.
使用这个技巧,我们可以创建一个共享库,然后将其注入(inject)到另一个进程中。此共享库将能够在调用 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
关于linux - 如何编辑linux内核文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22763565/