c - 在 fork 和 exec 之后在父子之间共享一个文件描述符

标签 c linux exec fork file-descriptor

我在 Linux 上有两个进程,A 和 B。 我想将进程 A 的文件描述符与进程 B 共享,现在我只是将其序列化为 char* 并将其传递给 execl 参数,但这并没有工作。

A.c 看起来像这样:

union descriptor{
    char c[sizeof(int)];
    int i;
} fd;
pid_t pid;

fd.i = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// Perform other socket functions

pid = fork();
if(pid == 0){
    // Read data from socket
    if(execl("./B", fd.c, NULL) < 0){
        exit(EXIT_FAILURE);
    }else(
        exit(EXIT_SUCCESS);
    }
}else if(pid < 0){
    exit(EXIT_FAILURE);
}else{
    waitpid(pid, NULL, 0);
}

B.c 看起来像这样:

union descriptor{
    char c[sizeof(int)];
    int i;
} fd;

memcpy(&fd.c[0], argv[0], sizeof(int));

write(fd.i, "TEST", 4);
close(fd.i);

但这行不通,我真的不明白为什么不行。我怎样才能使这项工作?如果可行,在 forkexec 之后在父子之间共享文件描述符是否是最佳解决方案?

更新

这个问题与我问的问题无关,它是由@OliCharlesworth 指出的传递整数的错误方式引起的。请关闭此问题。

最佳答案

文件描述符总是在父进程和子进程之间传递

当您fork 一个进程时,父进程中打开的文件描述符(在fork() 时)会隐式传递给子进程。无需明确发送它们。

例如:

伪代码如下所示:

在进程A中:

fd = open_socket_or_file;
char str_fd[3];
str_fd[0]=fd;
str_fd[1]=fd;
str_fd[2]=0;
if(fork()==0)
{
     execl("./B",str_fd,NULL);
}

在子进程B中你可以做:

int fd = argv[1][0];
/* now do whatever you want with the fd...*/

编辑:

如果进程不同,您需要显式传递文件描述符。这通常是使用 UNIX 域套接字完成的(如果您使用的是 Linux Flavors)。与此相关的代码可以看this answer

关于c - 在 fork 和 exec 之后在父子之间共享一个文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21512334/

相关文章:

c - strtok() 函数之谜

c - 运行这个有点奇怪的 c 代码后出现意外的输出。谁能解释这是怎么发生的?

递归函数的代码优化

Kotlin native - 执行可执行文件

C - 内部有 fork()/pipe() 的 WHILE 循环

linux - 如何在 nasm 上正确设置 execve 调用?

c - GSL 积分、错误计数

在 Linux EC2 实例中使用 sudo pip3 install python-binance 时 python-binance 无法编译错误

linux - 使用 bash 脚本更改文件名

linux - 计算 UNIX 时间时将日期数学舍入到最近的月份