如何将参数传递给clone()调用的函数?

时间:2011-12-03 02:10:13

标签: c parameters clone

我必须在main-function中使用clone()系统调用来获得2个线程。 (我知道,还有其他选择,但在这种情况下,它必须是clone())。

系统调用有效,两个线程都到达指定的函数(foo)。但是在这个函数中我需要它们用这个签名调用另一个函数:

void increment(int* a, int b)

(旁注:它将b * 1添加到a。(= a + b))

重要的是,a和b都在main-function中声明,我不知道如何将它们传递给foo。

我已经尝试了不同的东西,但没有成功。我得到了一个提示:使用适配器。 但我不知道如何做到这一点。 (我也不知道如何在使用int的clone中使用args。)

有什么建议吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);
}