【问题标题】:Calling a binary from C (whilst sharing file descriptors)从 C 调用二进制文件(同时共享文件描述符)
【发布时间】:2012-07-15 04:53:04
【问题描述】:

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

这个二进制文件应该共享同一个文件描述符表(因此之前使用了克隆)。上面的代码不正确,因为我认为系统不允许共享文件描述符表。 (我不想要 fd 的副本,我真的希望能够读/写它们)这些 fd 是套接字。

    int foo(int** args) {
     system(start program foo)
     _exit(0);
    }

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

谢谢

【问题讨论】:

    标签: c process clone fork system-calls


    【解决方案1】:

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

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

    【讨论】:

    • 我的印象是 fork 继承了文件描述符的副本,而不是 clone 主动共享表
    • @user1018513 :在 fork() 调用之后,您的套接字文件描述符也可以在孩子中使用。所以不需要任何表格共享。
    • @user1018513:您可以使用clone() 创建一个执行函数的进程,该函数依次调用execlp()(或其亲属之一)。但是,在这种情况下,fork() 是更简单的选择。 clone() 的文档也让我对它如何/将如何与 exec*() 合作感到摸不着头脑...
    • 谢谢,是的,我误解了 excelp() 的工作原理(我认为 fork 调用发生在 excel 中)。我只是按照您的建议使用了clone,然后是exec(因为我需要孩子关闭fd,我不能只使用fork)。谢谢。
    • @user1018513: 呃...一个孩子可以关闭通过fork() 继承的fd 好吗...?!?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2011-05-15
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2013-05-05
    相关资源
    最近更新 更多