Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C调用二进制文件(同时共享文件描述符)_C_Process_Clone_Fork_System Calls - Fatal编程技术网

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

从C调用二进制文件(同时共享文件描述符),c,process,clone,fork,system-calls,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 ,CLON

我正在玩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);
    }
如何使clone命令调用二进制文件而不是函数?(这是否可能),或者在共享文件描述符时使用系统调用

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

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

选择
fork()
/
execlp()
而不是
clone()
/
系统()
。分叉子级从父级继承文件描述符,
execlp()
(或其相关项)允许您在子级中加载不同的可执行文件


您可能可以在
clone()
调用的函数中
exec*()
(请参阅注释),但在本例中,
fork()
语义要简单得多。

我的印象是fork继承了文件描述符的副本,而不是主动共享文件的clonetable@user1018513:在fork()调用之后,您的套接字文件描述符在子系统中也可用。因此,不需要任何表共享。@user1018513:您可以使用
clone()
创建一个执行函数的进程,该函数反过来调用
execlp()
(或其相关函数之一)。但是,在这种情况下,
fork()
是更简单的选择。
clone()
的文档也让我对它如何能够/将如何与
exec*()
合作颇感困惑。谢谢,是的,我误解了excelp()的工作原理(我以为fork调用发生在excel中)。我只是按照你的建议使用了clone,后跟exec(因为我需要孩子关闭fd,所以我不能只使用fork)。谢谢。@user1018513:Erm。。。一个孩子可以通过fork()关闭继承的fd。好吧。。。?!?我的印象是fork继承了文件描述符的副本,而不是主动共享文件描述符的clonetable@user1018513:在fork()调用之后,套接字文件描述符也可以在子对象中使用。因此,不需要任何表共享。@user1018513:您可以使用
clone()
创建一个执行函数的进程,该函数反过来调用
execlp()
(或其相关函数之一)。但是,在这种情况下,
fork()
是更简单的选择。
clone()
的文档也让我对它如何能够/将如何与
exec*()
合作颇感困惑。谢谢,是的,我误解了excelp()的工作原理(我以为fork调用发生在excel中)。我只是按照你的建议使用了clone,后跟exec(因为我需要孩子关闭fd,所以我不能只使用fork)。谢谢。@user1018513:Erm。。。一个孩子可以通过fork()关闭继承的fd。好吧。。。?!?