2011-12-03 21 views
4

main関数でclone()システムコールを使用して2つのスレッドを取得する必要があります。 (私は知っている、他のオプションがありますが、この場合、それはクローン()でなければなりません)。clone()が呼び出す関数にパラメータを渡すにはどうすればよいですか?

システムコールが機能し、両方のスレッドが指定された関数(foo)に到着します。しかし、この機能では、私は彼らがこのシグネチャを持つ別の関数を呼び出す必要があります:

void increment(int* a, int b) 

(追記:それはへのb * 1を追加します(= + B)。)

重要なことがあること、ですaとbの両方がmain-functionで宣言されていて、それらをfooに渡す方法はわかりません。

私はすでにさまざまなことを試みましたが、成功しませんでした。私はヒントを得た:アダプターを使用する。 しかし、私はこれを行う方法の手がかりがありません。 (私はまたintとクローンでargsを使用する方法を知らない)

何か提案がありますか?

答えて

4

clone()の引数の1つは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が呼び出されたときにcreateはスコープ内にあります。あなたはする必要があります。ここで

+0

[OK]を感謝します。最大の問題は何とかそのvoidポインタに情報を取得することでした。私は明日これを試してみます(ここは遅いです)。 – pDOTgetName

+1

この例は少し危険ですが、 'fn'が実行される前にmainが復帰するかもしれないので、スタック上の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); 
} 
関連する問題