c - 在调用 C 中的任何 exec 函数后,我可以使用子进程中的 paren 进程打开的文件描述符吗?
问题描述
假设我有一个p
使用文件描述符(例如未命名管道)与父进程通信的进程p1
。
假设p
调用fork()
创建一个子进程,该子进程c
在fork()
调用其中一个exec
家庭函数之后。
默认情况下,即使使用exec
. 所以c
应该能够与之通信p1
,让它的父级p
打开一个文件描述符到p1
.
c
如果与该文件描述符对应的变量仅在p
(and ) 中定义,如何在子进程的 C 源代码中获取该文件描述符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"
有了自己的源代码,我不能使用变量fd
进行通信,p1
因为它没有定义但文件描述符应该存在:那么如何引用它并使用它呢?
解决方案
默认情况下,即使使用
exec
. 所以c
应该能够与之通信p1
,让它的父级p
打开一个文件描述符到p1
.
是的。主要附带条件是文件描述符未设置为 close-on-exec。
c
如果与该文件描述符对应的变量仅在p
(and ) 中定义,如何在子进程的 C 源代码中获取该文件描述符p1
?
您可以
dup2()
将文件描述为众所周知的数字,例如标准输入 (0)、标准输出 (1) 或标准错误 (2),或父子代码同意的其他数字。您可以将文件描述符编号作为参数传递给子项。
您可以将数字写入文件,孩子随后从中读取它。
作为前面的一个特例,您可以设置从父级到子级标准输入的管道,并通过管道将数字发送给子级。
这些不是唯一的可能性,但我认为它们涵盖了所有最简单和最好的可能性。请注意,第一个是唯一不依赖于孩子合作的。
推荐阅读
- google-cloud-platform - 将 SSH 密钥传输到 VM。( SSH 不适用于实例)
- sql-server - 如何让我的 SQL Server 数据库与我在 Azure 上部署的 REST API 一起工作?
- serverless-framework - DynamoDB 和无服务器:未授权执行:dynamodb:Query on resource
- javascript - ChartJS 每个数据集/独立数据集的单独标签?
- css - 如何在悬停时更改引导程序 4 导航栏切换器的颜色?
- macos - 如何在macOS上使用pf重写传入数据包的接口?
- rust - 将使用的变量保存在向量中
- r - 从 svykm(Lumley 的调查包)中提取样本方差以进行复杂的调查分析
- python - 如何使用 Bleach 完全删除 HTML 中的链接?
- swiftui - 使用 .background 和 VStack 时,NavigationLinks 保持突出显示