2012-07-16 64 views
1

我玩弄sycalls,和刚才写的代码沿C中调用一个二进制文件(同时共享文件描述符)

/* 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

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

你可能可以exec*()clone()称为(见注释)功能,但在这种情况下,fork()语义要简单得多。

+0

我的印象是,叉继承了文件描述符的副本,而不是克隆谁积极共享表 – user1018513 2012-07-16 10:50:53

+0

@ user1018513:fork()调用后,你的套接字文件描述符也可用在孩子。所以任何表共享都是不需要的。 – SKi 2012-07-16 10:59:43

+0

@ user1018513:你可以使用'的clone()'创建执行功能的过程中,其中*又*调用'execlp()'(或其亲属之一)。但是,在这种情况下'fork()'是更简单的选择。克隆的'我的文档()'也让我抓我的头了不少关于它如何能/会用'EXEC *合作()'... – DevSolar 2012-07-16 12:15:02