我正在玩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 ,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);
}
这个二进制文件应该共享相同的文件描述符表(因此之前使用了clone)。上面的代码是不正确的,因为我不认为系统允许共享文件描述符表。 (我不想要fds的副本,我真的希望能够读/写它们)这些fds是套接字。
int foo(int** args) {
system(start program foo)
_exit(0);
}
如何让clone命令调用二进制而不是函数? (这是可能的),还是在共享文件描述符时使用系统调用?
由于
答案 0 :(得分:4)
转到fork()
/ execlp()
而不是clone()
/ system()
。分叉子项从父级继承文件描述符,execlp()
(或其亲属)允许您在子级中加载不同的可执行文件。
你可能可能 exec*()
在clone()
调用的函数中(参见注释),但在这种情况下,fork()
语义要简单得多。