2011-12-03 52 views
4

我必須在主函數中使用clone()系統調用來獲得2個線程。 (我知道,還有其他選擇,但在這種情況下,它必須是clone())。如何將參數傳遞給clone()調用的函數?

系統調用起作用,兩個線程都到達指定的函數(foo)。但在這個功能我需要他們調用另一個函數與此簽名:

void increment(int* a, int b) 

(旁註:它增加了B * 1的(= A + B)。)

重要的是, a和b都在main函數中聲明,我不知道如何將它們傳遞給foo。

我已經嘗試過不同的事情,但沒有成功。我得到了一個提示:使用一個適配器。 但我不知道如何做到這一點。 (我也不知道如何在int中使用克隆的參數。)

有什麼建議嗎?

回答

4

clone()的其中一個參數是void* arg。這可以讓你傳遞一個void指針給你的函數。爲了傳遞一個int指針和一個int,你必須創建一個結構,它的int指針和int分別指定爲ab,然後將指向該結構的指針轉換爲void指針。然後在函數內部逆轉過程。

我的C是有點生疏,我還沒有編這一點,所以不要引用我,但它看起來應該大致是這樣的:

struct clone_args { 
    int* a; 
    int b 
}; 

int main(int argc, char* argv[]) 
{ 
    struct clone_args args; 
    args.a = a; 
    args.b = b; 
    void* arg = (void*)&args; 
    clone(fn, ..., arg, ...); 
} 

int fn(void* arg) 
{ 
    struct clone_args *args = (struct clone_args*)arg; 
    int* a = args->a; 
    int b = args->b; 
} 

注意:要小心,你結構當調用fn時,創建仍在範圍內,因爲它不會被複制。你可能需要malloc吧。

+0

確定感謝。最大的麻煩是以某種方式將信息輸入到無效指針中。我明天會試試這個(這裏遲到了)。 – pDOTgetName

+1

請注意,該示例有點危險,main可能會在'fn'運行之前返回,所以棧上的clone_args可能會消失。 – nos

0

下面是示例代碼:

#define stacksize 1048576 
typedef struct 
{ 
int ii; 
int jj; 
} someinput1; 

static int    /* Start function for cloned child */ 
childFunc(someinput1 *struc) 
{ 

    printf("Child: PID=%ld PPID=%ld\n", (long) getpid(), (long) getppid()); 

    printf("Hi!! I am child process created by Clone %ld \n",(long) getpid()); 
    printf("Value of x %d %d\n",struc->ii,struc->jj); 
} 


int main() 
{ 
someinput1 inputtest; 
int i; 
char *stack;     /* Start of stack buffer */ 
char *stack1;     /* End of stack buffer */ 
pid_t pid; 


stack = malloc(stacksize); 
stack1 = stack + stacksize; 

for (i = 0;i<5;i++) 
{ 
    inputtest.ii = i+5; 
    inputtest.jj = inputtest.ii + 10; 
    pid = clone(childFunc, stack1, NULL, (void *) (&inputtest)); 
    printf("clone returned -- %ld \n", (long) pid); 
} 

sleep(1);   
exit(EXIT_SUCCESS); 
} 
相關問題