gpt4 book ai didi

c - 使用共享文件和 dup2() 将命令的标准输出通过管道传输到另一个命令的标准输入

转载 作者:行者123 更新时间:2023-12-04 09:30:42 24 4
gpt4 key购买 nike

我正在写一个带有两个参数的 porgram - 命令的名称。程序应该将第一个命令的输出重定向到文件“tmp”而不是执行它,而不是将第二个命令的 stdin 重定向到“tmp”并执行第二个命令。


#include<unistd.h>
#include<fcntl.h>
#include<wait.h>
#include<stdio.h>

int main(int argc, char** argv){
int fd = open("tmp", O_RDWR |O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);
int cpid = fork();

if(cpid == 0){
dup2(fd, 1);
execlp(argv[1], "", NULL);
}

wait(NULL);
//If we uncoment this line the program gives correct output
//fd = open("tmp", O_RDWR, S_IRUSR | S_IWUSR);

dup2(fd, 0);

execlp(argv[2], "", NULL);
}
但是,当我运行像 ./main ls wc 这样的程序时代替 5 5 50我得到输出 0 0 0这意味着 wc命令从标准输入读取 0 个字节。
但是如果我在同一个文件 'tmp' 上重新创建文件描述符,程序会给出正确的输出。如何解释这种行为?

最佳答案

这个问题基本上是 Can anyone explain a simple description regarding 'file descriptor' after fork()? 的重复但由于这有点微妙,我将解释这个特定案例。

  • 该过程打开一个文件。这将创建一个文件描述。文件描述是文件和文件描述符之间的中间概念。它们没有直接在 Unix API 中公开,但是除了它们指向的文件之外,它们还有一个重要的属性,我们稍后会看到。
  • child 写入此文件描述。家长等待。
  • 父级从文件描述中读取。

  • 在第 2 步结束时,此文件描述上的文件位置是文件的结尾。所以在第 3 步,父进程从文件末尾开始读取。
    如果您添加到 rewind(fd) 的电话之后 wait(NULL) , child 将从文件的开头读取。
    如果您使用新的 open 打开相同的文件调用,这将创建一个新的文件描述。 open除非您设置追加模式,否则将新文件描述的位置放在文件的开头。
    可以通过任意数量的文件描述符访问相同的文件描述,可能在不同的进程中。文件位置是文件描述的一个属性,因此任何通过一个文件描述符移动它(读取、写入、搜索)的操作也会为其他文件描述符移动它,即使在不同的进程中也是如此。

    关于c - 使用共享文件和 dup2() 将命令的标准输出通过管道传输到另一个命令的标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62866800/

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