2011-02-02 53 views
6

我已经使用RTLD_NEXT重载了fork()系统调用并创建了我自己的版本fork()。那就是,dlsym(RTLD_NEXT, fork)。这将击中我的版本的叉子。在此之后,我想复制实际的fork()系统调用的任务,即创建子进程并返回pid,以及一些更多的附加功能。Overloading fork()

我无法弄清楚如何做到这一点。我检查了内核源代码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()时,父级的内存分配表将被复制到子级。

+0

你是什么意思的“不工作”?运行时错误?编译器错误? – Simone 2011-02-02 08:47:31

+0

@Simone:_fork(); //错误:_fork没有声明。我的想法是让它碰到fork的实际内核版本,而不是我的。希望现在明确。 – kingsmasher1 2011-02-02 08:50:54

+0

你到底想做什么?你最终的目标是什么? – Omnifarious 2011-02-02 08:51:18

回答

3

在包含<sys/syscall.h>之后,您应该可以调用实际的forksyscall(SYS_fork)。见syscall(2)

7

你不会从内核源代码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功能的前值的一些方法。

0

既然你盗号严重,无论如何,为什么不直接使用宏

#define fork() (spoon(),fork()) 

#define fork() spoon(fork()) 

其中spoon然后函数,它要完成的事情。

预处理程序保证不会递归,并且只将fork保留在expasion中。