我必须在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。)
有什么建议吗?
答案 0 :(得分:4)
clone()
的一个论点是void* arg
。这允许您将void指针传递给您的函数。为了传递一个int指针和一个int,你必须创建一个带有int指针的结构,并分别将int赋给a
和b
,然后将指向该结构的指针转换为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);
}