从C调用二进制文件(共享文件描述符时)

时间:2012-07-16 10:42:14

标签: 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 ,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命令调用二进制而不是函数? (这是可能的),还是在共享文件描述符时使用系统调用?

由于

1 个答案:

答案 0 :(得分:4)

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

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