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

标签 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);
    }

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

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

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

谢谢

最佳答案

使用 fork()/execlp() 而不是 clone()/system()。 fork 子项从父项继承文件描述符,execlp()(或其相关函数)允许您在子项中加载不同的可执行文件。

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

关于从 C 调用二进制文件(同时共享文件描述符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502662/

相关文章:

javascript - 克隆javascript对象属性?

java - 尝试克隆数组时出现 ArrayIndexOutOfBoundsExcetion

将MATLAB的fzero函数(布伦特法)转换为C代码

c - 有没有办法_完全_避免缓存未命中?

python - 在 Python 中产生和等待子进程

c - 为什么我可以在 debian 中终止状态 D 的进程?

javascript - 在迭代期间在每个容器中复制图像

c - 哪些数据结构和算法不能用 C 实现?

c - 获取内核中的System32目录

c# - ASP.Net 服务器上的进程无法通过 IIS 正确运行