2013-06-11 17 views
1

假設我有main.c如何在調用unix中的raise時共享/傳遞參數?

void myfunc(int num) 
{ 
    printf("%d \n", num); 
    signal(SIGUSR1, myfunc); 
} 

int main(void) 
{ 
    void (*prev_fn)(int); 
    prev_fn = signal(SIGUSR1, myfunc); 
    if (prev_fn == SIG_IGN) signal(SIGUSR1,SIG_IGN); 
} 

.so其中main.c加載一個foo函數調用raise

raise(SIGUSR1); 

我如何打電話時提出,傳遞一個參數char *除了使用外部緩衝區?

+4

你不能。 'raise()'接受一個'int'參數,沒有別的。另外,你的信號處理程序必須被定義爲void function(int),並且不能添加額外的參數。您希望處理程序具有的任何其他信息必須位於某種全局變量中。 – twalberg

+1

您已經描述了嘗試實施問題解決方案時遇到的絆腳石。也許你可以描述你正在試圖解決的問題,並且我們可以建議一種不同的方法來解決它。 – jxh

+0

@twalberg我不能使用全局變量,因爲foo在.so文件中,而且無法訪問'main.c'中的變量我可以使用'extern'但我不想要。 – 0x90

回答

1

在評論,您寫道:

我不能使用全局,因爲foo.so文件,並且不能訪問在main.c變量我可以用extern但我不想。

你可以做的是提供您的.so文件中的函數,基於可用的信號處理器(信號)的信息返回適當的緩衝液:

char * get_foo_buffer (int sig) 
{ 
    char *buffer = 0; 
    /* ... retrieve the right buffer ... */ 
    return buffer; 
} 

現在,信號處理函數可以調用get_foo_buffer(num)從共享庫中獲取緩衝區。