我重载了fork()系统调用,并使用RTLD_NEXT创建了自己的fork()版本。就是,dlsym(RTLD_NEXT, fork)。这将击中我的版本的叉子。在此之后,我希望复制实际的fork()系统调用的任务,即创建子进程和返回pid,以及一些更多的附加功能。
我想不出该怎么做。我检查了fork()的内核源代码(fork.c),但找不到多少。
这样做:
dlsym(RTLD_NEXT,fork);
int fork(void) {
int pid=_fork(); // Trying to call actual fork does not work
return pid;
}我怎么能这么做?下面是到叉的内核源代码的链接:http://lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10
编辑(从评论中调入)
我正在开发一个泄漏检测工具,当子进程删除父进程分配的内存时,这个工具会检测到双空闲。为了克服这个问题,我将重写fork(),每当有fork()时,父内存分配表就会复制到子表。
发布于 2011-02-02 08:50:24
在包含了fork之后,您应该能够用syscall(SYS_fork)调用实际的<sys/syscall.h>。见syscall(2)。
发布于 2011-02-02 08:48:58
您将无法从fork的内核源代码中获得任何有用的信息。您的代码将不被允许做内核所做的事情,不管您管理什么库欺骗。这是一个硬边界,不编写内核模块是无法突破的。
fork的所有库代码都是设置并执行一条特殊指令,该指令切换到内核模式,其中执行内核的fork代码。有一种方法可以将这个特殊的指令放入您自己的代码中。这是syscall函数。因为fork没有参数,所以使用这个函数进行系统调用应该相对容易。
但这不是我建议你做的。我建议你这样做:
typedef int (*forkfunc_t)(void);
int fork(void)
{
forkfunc_t sysfork = (forkfunc_t)dlsym(RTLD_DEFAULT, "fork");
return sysfork();
}基本上,无论您做什么共享库黑客行为,在用您自己的函数替换之前,您应该找到一些方法来检索fork函数的前一个值。
发布于 2011-02-02 09:01:55
既然您的黑客能力很差,那么为什么不直接使用宏呢?
#define fork() (spoon(),fork())或
#define fork() spoon(fork())其中,spoon是执行您想要完成的任务的函数。
预处理器保证不执行递归,并将fork保留在扩展中。
https://stackoverflow.com/questions/4872314
复制相似问题