2012-08-03 273 views
0

在很多的腳本語言,我們有一個編程的方法是這樣的:如何用C語言重寫一個函數(系統調用)?

首先,有一個名爲FUNC功能:

void func() 
{ 
} 

其次,我想記錄一些信息,當客戶端調用這個函數,但我不想 修改功能,這樣我就可以這樣做:

void (*pfunc)(void) = func; 
void func() 
{ 
    log("Someone call fund"); 
    pfunc(); 
} 

之後,誰打電話基金將打電話給我「覆蓋」功能。本是很多的腳本語言確定。我可以用C語言做同樣的事嗎?以及如何編碼?

我想用這種方法在一些3party庫中做一些工作,所以我必須做一些影響鏈接過程的事情,而不僅僅是編譯過程。

回答

1

也許您在尋找library interposer。您可以在文件中定義自己的函數,並使用該函數而不是系統調用來調用要記錄調用的程序。

例如,通過插入取得ls一些系統調用:

$ LD_PRELOAD=/your/own/functions/file.so ls -l 

它更適合在那裏你可以不改變程序代碼(也許是因爲它是不可用)的情況正在調用你想要的功能登錄。

7

你將與宏代碼它,在你簡單的情況

#define func()    \ 
do {       \ 
    log("Someone called func"); \ 
    func();     \ 
} while(0) 

宏宏沒有遞歸擴展的擴張內。

對於更復雜的情況,你會實現一個函數和一個宏。在「.h」頭文件,你會放:

void func_annotated(void); 
#ifdef DEBUG 
# define func() func_annotated() 
// or if the function takes parameters 
// # define func(...) func_annotated(__VA_ARGS__) 
#endif 

在「.c」的文件,然後你把實現

void func_annotated(void) 
{ 
    log("Someone called func"); 
    (func)(); 
} 

這裏額外()角落找尋func確保這總是使用真正的功能。

+0

另外,爲此可能需要使用可變參數宏。 – netcoder 2012-08-03 14:46:28

0

你不需要在這種情況下使用函數指針。您可以使用功能func爲您想要記錄的任何參數。同樣的事情與重寫,不需要是一個函數指針(除非你計劃改變重寫函數將在以後)。此外,在這種情況下,它將創建一個無限循環,因爲函數指針指向func函數。另外,我甚至不確定在聲明函數之前是否允許使用func作爲函數指針。

我會嘗試這樣的事情,這會記錄一個整數,但你可以用它來記錄任何你想要的。

void func(int value) 
{ 
    printf("%d\n", value); 
    anotherFunc(value); 
} 

其中anotherFunc()是完全不同的功能。就像我之前說的,如果你想改變anotherFunc()所調用的函數,那麼使用函數指針是有意義的,否則就不需要。