我正在玩 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);
}
这个二进制文件应该共享相同的文件描述符表(因此之前使用了克隆)。上面的代码是不正确的,因为我认为系统不允许共享文件描述符表。 (我不想要 fds 的副本,我真的希望能够读/写它们)这些 fds 是套接字。
int foo(int** args) {
system(start program foo)
_exit(0);
}
如何使克隆命令调用二进制文件而不是函数? (这甚至可能),还是在共享文件描述符的同时使用系统调用?
谢谢
最佳答案
使用 fork()
/execlp()
而不是 clone()
/system()
。 fork 子项从父项继承文件描述符,execlp()
(或其相关函数)允许您在子项中加载不同的可执行文件。
您可能可以 exec*()
在 clone()
调用的函数中(见评论),但在这种情况下 fork()
语义要简单得多。
关于从 C 调用二进制文件(同时共享文件描述符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502662/