首页
学习
活动
专区
圈层
工具
发布

问过载叉()
EN

Stack Overflow用户
提问于 2011-02-02 08:42:30
回答 3查看 1.4K关注 0票数 6

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

我想不出该怎么做。我检查了fork()的内核源代码(fork.c),但找不到多少。

这样做:

代码语言:javascript
复制
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()时,父内存分配表就会复制到子表。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-02 08:50:24

在包含了fork之后,您应该能够用syscall(SYS_fork)调用实际的<sys/syscall.h>。见syscall(2)。

票数 3
EN

Stack Overflow用户

发布于 2011-02-02 08:48:58

您将无法从fork的内核源代码中获得任何有用的信息。您的代码将不被允许做内核所做的事情,不管您管理什么库欺骗。这是一个硬边界,不编写内核模块是无法突破的。

fork的所有库代码都是设置并执行一条特殊指令,该指令切换到内核模式,其中执行内核的fork代码。有一种方法可以将这个特殊的指令放入您自己的代码中。这是syscall函数。因为fork没有参数,所以使用这个函数进行系统调用应该相对容易。

但这不是我建议你做的。我建议你这样做:

代码语言:javascript
复制
typedef int (*forkfunc_t)(void);

int fork(void)
{
     forkfunc_t sysfork = (forkfunc_t)dlsym(RTLD_DEFAULT, "fork");
     return sysfork();
}

基本上,无论您做什么共享库黑客行为,在用您自己的函数替换之前,您应该找到一些方法来检索fork函数的前一个值。

票数 7
EN

Stack Overflow用户

发布于 2011-02-02 09:01:55

既然您的黑客能力很差,那么为什么不直接使用宏呢?

代码语言:javascript
复制
#define fork() (spoon(),fork())

或

代码语言:javascript
复制
#define fork() spoon(fork())

其中,spoon是执行您想要完成的任务的函数。

预处理器保证不执行递归,并将fork保留在扩展中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4872314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档