c - Fd[0] 之后的 dup2!= STDIN_FILENO

标签 c linux pipe

有人可以在检查 fd[0] != STDIN_FILENO 后解释使用 dup2 的原因吗,因为据我了解 fd[0] ! = STDIN_FILENO 会失败并且 dup2 仍会返回 STDIN_FILENO 以外的内容,只是想了解一些示例代码谢谢,如果有人可以解释使用execlp 对我来说太棒了。

int fd[2];
pid_t pid;

if(argc != 2) {
        fprintf(stderr, "Must be specify exactly 1 file\n");
        exit(0);
    }

    if(pipe(fd) < 0)
        exit(1);./ 

    pid = fork();

    switch (pid) {
        case -1:
            exit(1);
        case 0:
            close(fd[1]);
                        //here
            if(fd[0] != STDIN_FILENO) {
                if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
                    exit(3);
                close(fd[0]);
            }
            if(execlp("tr", "tr", "[a-z]", "[A-Z]", (char *) 0) < 0)
                exit(4);
            break;

        default:
            close(fd[0]);
                        // and here
            if(fd[1] != STDIN_FILENO) {
                if(dup2(fd[1], STDIN_FILENO) != STDIN_FILENO)
                    exit(5);
                close(fd[1]);
            }
            if(execlp("cat", "cat", argv[1], (char *) 0) < 0)
                exit(4);
            break;
    }
    return 0;

最佳答案

目的是让stdin(STDIN_FILENO,为0)指向fd[0]指向的文件(管道的读取端)。首先检查它们是否已经相同……如果是,代码会将 0 复制为 0,然后关闭 0——不好。如果它们不相同,请使用 dup2 使 STDIN_FILENO 指向 fd[0] 指向的位置。如果 dup2 成功,它会返回它的第二个参数,因此如果 dup2 失败,则通过调用退出进行检查。

你写

From what I understand fd[0] != STDIN_FILENO would fail

完全不清楚您为什么“理解”这一点。它仅在 fd[0] 包含 STDIN_FILENO(即 0)时失败,但不太可能,因为它包含由 pipe 调用分配的文件描述符。

dup2 would still return something other than STDIN_FILENO

dup2 如果成功则返回它的第二个参数。它不会返回 STDIN_FILENO 以外的东西,除非它失败了——为什么会这样呢? -- 在这种情况下它返回 -1。

关于c - Fd[0] 之后的 dup2!= STDIN_FILENO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677403/

相关文章:

linux - Bash 管道和 SIGTERM

c - 在命名管道和 popen 方面需要帮助

c - 在 Visual Studio 2010 中链接不同的 C 源文件

c - 将指针从 c 传递到 asm 并将值添加到 sse 寄存器

linux - 有关 DS 记录更新的 DNSSEC key 翻转

linux - 如何在 vi 编辑器或 linux 中查找和删除两个文件中的重复行

c# - 在 C# 中实现管道 - 使用哪些(流?)类?

c - 使用 C 代码验证 OpenSSL s/mime 签名

c - 如何在 Unix 中使用信号处理程序?

Linux 检查字符串是否作为单独的单词存在(而不是另一个的子字符串)