当前位置: 首页 > 面试题库 >

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

方博
2023-03-14
问题内容

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

Ac看起来像这样:

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

BC看起来像这样:

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);

但这是行不通的,我也不明白为什么不这样做。我该如何进行这项工作?如果它的工作原理,它是经过共享父母和孩子之间的文件描述符的最佳解决方案fork和一个exec

更新资料

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


问题答案:

File descriptors are always passed between a parent and child process

当您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域套接字(如果使用LinuxFlavors)来完成此操作。



 类似资料:
  • 问题内容: 假设我使用打开文件。然后我我的程序。 现在,父亲和孩子会为文件描述符共享相同的偏移量吗? 我的意思是,如果我在父亲那里写书,那么偏移量也会在孩子身上改变吗? 还是在?之后偏移是独立的? 问题答案: 来自:

  • null 在列出的3个选项中,只有最后一个可以使用projectile(可能还有其他Emacs包)。但我需要能够访问/修改文件从Windows以及,所以这不是一个可行的选择。 有没有人为此找到好的解决方案?

  • 我有两个问题。我理解,如果我在cookie中指定域为(带前导点),那么所有子域都可以共享一个cookie。 是否可以访问在中创建的cookie(没有子域)? 如果在中创建,(没有子域)是否可以访问cookie?

  • 问题内容: 我一直想在Google上找到这四个之间的区别,我希望这方面会有大量的信息,但是这四个调用之间确实没有任何可靠的比较。 我着手尝试汇编一下这些系统调用之间的区别的基本概况,这就是我得到的。所有这些信息是否正确/我是否缺少任何重要信息? :fork调用基本上是对当前过程进行复制,几乎在所有方面都相同(例如,并非在某些实现中都复制了所有内容,例如,在某些实现中资源有限,但其想法是创建尽可能近

  • 问题内容: 如何防止跨fork()系统调用复制文件描述符(当然,不关闭文件描述符)? 我正在寻找一种方式来纪念 一个文件描述符 作为 不被继承(复印通) (如果你喜欢这么FD_DONTINHERIT功能)通过孩子fork()的,有点像FD_CLOEXEC般的技巧,但对于叉。有人这样做吗?或对此进行了调查,对我有一个提示? 谢谢 更新: 我可以使用libc的__register_atfork 在fo

  • 问题内容: 我有一些cookie存储在http://sub1.myserver.com中 ,我希望能够在http://myserver.com中看到它们。 问题答案: 我能够使用以下代码来做到这一点: