gpt4 book ai didi

c - 更好地理解管道

转载 作者:行者123 更新时间:2023-12-02 03:19:19 25 4
gpt4 key购买 nike

在学习管道的时候,误写了如下代码

int main()
{
pid_t pid;
int status;
int p1[2];

pid = fork();
pipe(p1);

if(pid==0)
{
dup(p1[0], 0);
close(p1[1]);
execv(abs_addr_of_some_bin , argv);
}
else
{
dup(p1[1] , 1);
close(p1[0]);
write(p1[1] , some_rand_text , size_of_text);
wait(&status);
}
}

正在执行的二进制文件有一个 read(0 , buf , size) 语句,它从 STDIN 读取。

嗯,上面的代码显然是不正确的,因为我在pipe() 之前有fork()。因此,当我尝试在另一个二进制文件中输出 buf 时,它会打印一些随机值,每次我执行该文件时该值都不同。这背后的原因可能是什么?

此外,如果我更正我的代码(即在 fork() 之前调用 pipe()),有些与管道工作相关的事情让我感到困惑:

  1. 由于 p1 数组对于两个进程(父进程和子进程)具有不同的内存地址,操作系统如何知道 p1[0] 的另一端(在子进程中)是 p1[1](在父级中)吗?

  2. 这个过程中发生了什么样的内存操作?

提前致谢!

最佳答案

不要在 fork 之前创建管道!如果您之后创建它,那么您将创建两个不相关的管道...因为您需要为两个进程共享同一个管道,所以在 fork 之前创建它。

您有随机值,因为您的管道没有连接,并且某些东西没有真正测试您的execed 进程中的read

关于地址。没有 p1 在父子中有完全相同的地址!但是这些地址在不同的地址空间中。进程操作的地址总是相对于它给定的地址空间。

fork 复制了父进程的地址空间,并为子进程构建了它的严格副本。

关于c - 更好地理解管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34543167/

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