c - 在 C 中实现管道时出现错误的文件描述符错误

标签 c shell file-io pipe piping

我正在尝试实现一个类似 shell 的示例程序,它执行命令 ls |厕所

使用管道来实现命令。当我执行命令时,出现以下错误。

wc: 标准输入:错误的文件描述符 0 0 0 wc: -: 错误的文件描述符

请查看代码并提供输入 注意:1) parse 是一个库,它接收键入的输入并将每个命令作为带有 args 和必要数据的链表返回。解析工作正常 2)我在不同的子进程中执行每个命令,因此 fork

#include <stdio.h>
#include <stdlib.h>
#include "parse.h"

int pip[3][2];
int main(int argc, char *argv[], char *envp[])
{
    Pipe p; 
    Cmd c;
    pipe(pip[0]);
    pipe(pip[1]);   
    pid_t pid;
    pid=fork();
    char *host = "armadillo";
    printf("%s%% ", host);
    p = parse();
    c=p->head;  
    printf("1 \n");
    pid=fork();

    if(pid==0)
    {
        close(pip[0][0]);
        close(STDOUT_FILENO);
        dup2(pip[0][1],STDOUT_FILENO);
        execvp(c->args[0],c->args);
    }
    else
    {
        waitpid(pid,NULL,0);
    }
    printf("2 \n");

    close(pip[0][1]);
    close(pip[0][0]);

    c=c->next;
    printf("%s \n",c->args[0]);
    pid=fork();
    if(pid==0)
    {
        close(STDIN_FILENO);
        dup2(pip[0][0],STDIN_FILENO);
        close(pip[0][1]);
        execvp(c->args[0],c->args);
    }
    else
    {   
        waitpid(pid,NULL,0);
        close(pip[0][1]);
        close(pip[0][0]);
    }

}

最佳答案

这里有个主要问题:

close(pip[0][1]);
close(pip[0][0]);

...

dup2(pip[0][0],STDIN_FILENO);
close(pip[0][1]);

在这里您首先关闭文件描述符,然后稍后在程序中尝试再次使用它们。

关于c - 在 C 中实现管道时出现错误的文件描述符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26328010/

相关文章:

c - 如何用汇编程序将二进制数据写入文件?

bash - 使用 Control C 防止 shell 脚本退出

linux - 支持 FD-number 和文件名参数化重定向

grails - 如何使用Grails读取本地文件?

python - 如何将 stdout 和 stderr 重定向到管道但保持有序

c - 我需要帮助在简单的 C 代码中声明参数

c++ - 如何从 C++ 使用 FTGL C API?

javascript - 使用 Opera 小部件模拟器的 Opera 小部件中的文件 I/O 问题

c++ - 静态与新建/Malloc

shell - 如何更改新添加的列中第一行的值