1

我正在玩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);
    }

如何使克隆命令调用二进制而不是函数?(这甚至可能),还是在共享文件描述符时使用系统调用?

谢谢

4

1 回答 1

4

fork()/execlp()而不是clone()/ system()。分叉的子代从父代继承文件描述符,并且execlp()(或其亲属)允许您在子代中加载不同的可执行文件。

您可能可以 exec*()在由(参见注释)调用的函数中clone(),但在这种情况下,fork()语义要简单得多。

于 2012-07-16T10:47:52.153 回答