从C调用二进制文件(同时共享文件描述符)
我正在玩sycalls,我刚刚编写了一些代码,这些代码都是按照从C调用二进制文件(同时共享文件描述符),c,process,clone,fork,system-calls,C,Process,Clone,Fork,System Calls,我正在玩sycalls,我刚刚编写了一些代码,这些代码都是按照 /* Clone the process and launch Something */ child_stack = (void *) malloc(max_memory); args = malloc(2 * sizeof (int **)); args[0] = in_socket_fds; args[1] = out_socket_fds; clone(foo, child_stack + max_memory ,CLON
/* Clone the process and launch Something */
child_stack = (void *) malloc(max_memory);
args = malloc(2 * sizeof (int **));
args[0] = in_socket_fds;
args[1] = out_socket_fds;
clone(foo, child_stack + max_memory ,CLONE_FILES|CLONE_VM|CLONE_IO|CLONE_FS, (void *) args);
wait();
其中,foo函数是:
int foo(int** args) {
fprintf(stderr, "Hello world %d %d", args[0][0], ags[1][0]);
_exit(0);
}
我真正想做的是从foo函数调用二进制文件
int foo(int** args) {
system(start program foo)
_exit(0);
}
此二进制文件应共享相同的文件描述符表(因此以前使用克隆)。上面的代码不正确,因为我认为系统不允许共享文件描述符表。(我不想要FD的副本,我真的希望能够读/写它们)这些FD是套接字
int foo(int** args) {
system(start program foo)
_exit(0);
}
如何使clone命令调用二进制文件而不是函数?(这是否可能),或者在共享文件描述符时使用系统调用
感谢您选择fork()
/execlp()
而不是clone()
/system()
。分叉子级从父级继承文件描述符,execlp()
(或其相关项)允许您在子级中加载不同的可执行文件
您可能可以在clone()
调用的函数中exec*()
(请参阅注释),但在这种情况下fork()
语义要简单得多。选择fork()
/execlp()
而不是clone()
/系统()
。分叉子级从父级继承文件描述符,execlp()
(或其相关项)允许您在子级中加载不同的可执行文件
您可能可以在
clone()
调用的函数中exec*()
(请参阅注释),但在本例中,fork()
语义要简单得多。我的印象是fork继承了文件描述符的副本,而不是主动共享文件的clonetable@user1018513:在fork()调用之后,您的套接字文件描述符在子系统中也可用。因此,不需要任何表共享。@user1018513:您可以使用clone()
创建一个执行函数的进程,该函数反过来调用execlp()
(或其相关函数之一)。但是,在这种情况下,fork()
是更简单的选择。clone()
的文档也让我对它如何能够/将如何与exec*()
合作颇感困惑。谢谢,是的,我误解了excelp()的工作原理(我以为fork调用发生在excel中)。我只是按照你的建议使用了clone,后跟exec(因为我需要孩子关闭fd,所以我不能只使用fork)。谢谢。@user1018513:Erm。。。一个孩子可以通过fork()关闭继承的fd。好吧。。。?!?我的印象是fork继承了文件描述符的副本,而不是主动共享文件描述符的clonetable@user1018513:在fork()调用之后,套接字文件描述符也可以在子对象中使用。因此,不需要任何表共享。@user1018513:您可以使用clone()
创建一个执行函数的进程,该函数反过来调用execlp()
(或其相关函数之一)。但是,在这种情况下,fork()
是更简单的选择。clone()
的文档也让我对它如何能够/将如何与exec*()
合作颇感困惑。谢谢,是的,我误解了excelp()的工作原理(我以为fork调用发生在excel中)。我只是按照你的建议使用了clone,后跟exec(因为我需要孩子关闭fd,所以我不能只使用fork)。谢谢。@user1018513:Erm。。。一个孩子可以通过fork()关闭继承的fd。好吧。。。?!?