调用者如何通过指定多个参数来正确使用 clone() 系统调用?

如何解决调用者如何通过指定多个参数来正确使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?