假设我有一个进程p
,该进程使用文件描述符(例如,未命名的管道)与父进程p1
进行通信。
假设p
调用fork()
创建一个子进程c
,该子进程在fork()
之后立即调用exec
族函数之一。
即使使用exec
,默认情况下父对象的文件描述符也会复制到孩子。因此,c
应该能够与p1
进行通信,让其父p
打开到p1
的文件描述符。
如果仅在c
(和p
)中定义了与该文件描述符相对应的变量,如何在p1
子进程的C源代码中获取该文件描述符?< / p>
仅举一个例子,下面是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"
拥有自己的源代码,由于无法定义变量,但文件描述符应该存在,因此我无法使用变量fd
与p1
进行通信:因此如何引用并使用它?
答案 0 :(得分:1)
默认情况下,甚至父级的文件描述符也会复制到子级 使用
exec
时。因此,c
应该能够与p1
通信, 其父项p
为p1
打开了文件描述符。
是的。主要条件是未将文件描述符设置为close-on-exec。
如何在
c
子代的C源代码中获取该文件描述符 如果对应于该文件描述符的变量是 仅在p
(和p1
)中定义?
您可以dup2()
将文件描述到一个众所周知的数字上,例如stdin(0),stdout(1)或stderr(2)或其他一些带有父代代码的数字同意。
您可以将文件描述符号作为参数传递给孩子。
您可以将数字写入孩子随后从中读取的文件中。
作为上一个特殊情况,您可以设置从父级到子级stdin的管道,然后通过该管道将编号发送给子级。
这些不是唯一的可能性,但我认为它们涵盖了所有最简单和最好的可能性。请注意,第一个是唯一一个不依赖孩子合作的人。