gpt4 book ai didi

在调用 C 中的任何 exec 函数后,我可以在子进程中使用父进程打开的文件描述符吗?

转载 作者:行者123 更新时间:2023-11-30 14:42:14 35 4
gpt4 key购买 nike

假设我有一个进程p使用文件描述符(例如无名管道)与其父进程通信 p1 .

假设p来电 fork()创建子进程c就在fork()之后调用 exec 之一家庭功能。

默认情况下,即使使用exec,父级的文件描述符也会复制到子级。 。所以c应该能够与 p1 进行通信,其父项 p打开一个文件描述符到 p1 .

如何在 c 的 C 源代码中获取该文件描述符子进程,如果与该文件描述符对应的变量仅在 p 中定义(和p1)?

举个例子来说明我的意思,以下是 p 的代码和p1

//p1 process
int fd[2];
pipe(fd);
pid_t p_pid, c_pid;

p_pid = fork();
if(p_pid == 0) // p process
{
/* p_pid closes up input side of pipe */
close(fd[0]);
c_pid = fork();
if (c_pid)==0 //c child process
{
exec("execution/child/process"...);
}
else
{
...// do p process parenting stuff
}

}
else
{
/* Parent p1 process closes up output side of pipe */
close(fd[1]);
}

现在是"execution/child/process"有它自己的源代码,我不能使用变量 fdp1 沟通因为它没有定义,但文件描述符应该存在:那么如何引用它并使用它?

最佳答案

By default parent's file descriptors are duplicated to the child even when using exec. So c should be able to communicate with p1, having its parent p opened a file descriptor to p1.

是的。主要条件是文件描述符未设置 close-on-exec。

How can I get that file descriptor in the C source code of c child process if the variable corresponding to that file descriptor is defined only in p (and p1)?

  • 您可以将文件描述符 dup2() 转换为众所周知的数字,例如 stdin 的 (0)、stdout 的 (1) 或 stderr 的 (2) 或其他一些数字父子代码达成一致。

  • 您可以将文件描述符编号作为参数传递给子级。

  • 您可以将数字写入文件, child 随后可以从中读取该数字。

  • 作为前一种情况的特殊情况,您可以设置从父级到子级标准输入的管道,并通过管道将数字发送到子级。

这些并不是唯一的可能性,但我认为它们涵盖了所有最简单和最好的可能性。请注意,第一个是唯一一个不依赖于 child 合作的。

关于在调用 C 中的任何 exec 函数后,我可以在子进程中使用父进程打开的文件描述符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493565/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com