2011-02-02 35 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中。