如何解决调用者如何通过指定多个参数来正确使用 clone() 系统调用?
我正在对 clone() 系统调用进行一些研究,希望有人能向我解释为什么允许调用者在此系统调用结束时传递多个参数?
查看 Linux 手册页中的文档,系统调用的语法如下:
int clone(int (*fn)(void *),void *stack,int flags,void *arg,...
/* pid_t *parent_tid,void *tls,pid_t *child_tid */ );
在我看来,预期的第一个参数是返回整数 int
的函数地址,而该函数只能接受一个参数,即空指针 (void *)
。但是,在最后一个参数 void *arg
之后,我认为它是您想要传递给函数的空指针,有一个省略号运算符 ...
,我认为在 C 中表示可以指定多个参数.
鉴于您传入第一个参数的函数只能接受一个参数,调用者将如何利用添加到此系统调用末尾的更多参数?
为了更好地理解,我编译并运行了下面的代码。据我所知,它工作得很好,但我不知道如何或为什么有人会使用像 extraParm
#define STACK 8192
int do_something(void *somevar){
printf("Parent pid: %d\n Child pid : %d\n",getppid(),getpid());
printf("Our variable passed : %d\n",*(int *)somevar);
return 0;
}
int main() {
void *stack = malloc(STACK);
int inputParm = 11;
void *inputPtr = &inputParm;
char extraParm[ ] = "Extra Parameter";
if(!stack) {
perror("Malloc Failed");
exit(0);
}
if( clone( &do_something,(char *)stack + STACK,SIGCHLD,inputPtr,extraParm) < 0 ){
perror("Clone Failed");
exit(0);
}
printf("Clone call current pid : %d\n",getpid());
sleep(1);
free(stack);
return 0;
}
输出:
Clone call current pid : 545
Parent pid: 545
Child pid : 546
Our variable passed : 11
我一定是误解了什么,任何澄清将不胜感激
解决方法
附加参数是可选参数,用于指定克隆操作的附加操作。只有在 flags
参数中设置了特定标志时才使用它们。如果您未设置任何这些标志,则无需提供其他参数。
如果设置 CLONE_PARENT_SETTID
标志,子线程 ID 将存储在父进程中 parent_tid
指向的位置。
如果您设置了 CLONE_SETTLS
标志,则 tls
参数将用作线程本地存储描述符的地址。
如果您设置了 CLONE_CHILD_SETTID
标志,则子进程的线程 ID 将存储在 child_tid
指向的子进程中。
这样做是为了向后兼容。这些参数不在最初的 clone()
系统调用中,而是在后来的 Linux 版本中添加的。它们是可选的,因此旧代码将继续编译。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。