c - 管道只执行一次命令

标签 c linux bash shell

我是 StackOverflow 的新手,正在学习 C 中的管道。我正在尝试制作一个 shell interpeter,它允许引入 2 个由管道链接的命令,例如

/bin/ls -l | /bin/grep a

我有一个 main,它有一个读取命令的函数,然后 main 调用一个搜索“|”的函数如果找到它,该函数会从中生成 2 个命令,然后该函数调用另一个执行命令的命令。我的问题是它只工作一次。如果我引入一个带有管道的命令,它会完美地执行它,但如果我再次这样做,它就不起作用,就像目录发生了变化一样。第一个命令是否有管道并不重要,第二个命令(如果有管道)不会正确执行。我认为这是因为管道,执行管道的函数代码:

void execute_pipes(char *** command1, char *** command2){
pid_t son;
int tube2[2];
pipe(tube2);
son=fork();
if(son==0){//son1
    dup2(tube2[1], STDOUT_FILENO);
    close(tube2[0]);

    if(execv((*command1)[0],*command1)==-1){
        printf("Error");
        exit(0);
    }
}else{//father
    son=fork();
    if(son==0){//son2
        dup2(tube2[0], STDIN_FILENO);
        close(tube2[1]);


        if(execv((*command2)[0],*command2)==-1){
            printf("Error");
            exit(0);
        }
    }else{//father
        close(tube2[0]);
        close(tube2[1]);
        waitpid(son, NULL, 0);


    }
}
}

我确定参数没问题,以 NULL 参数结尾(如果不是,我猜它不会执行一次)。在每次新读取中,都会创建一个新管道。我想最后一个管道不会影响这个新管道,但我不知道...... 这方面的一个例子:

   /home/user/Desktop$ /bin/ls -l | /bin/grep -
-rw-rw-r-- 1 user user      435 dec 18 02:33 filename
 drwxrwsr-x 9 user user     4096 dec 20 19:23 filename
-rwxrwxr-x 1 user user    14464 dec 20 20:29 filename
-rw-rw-r-- 1 user user  3580430 dec  5 03:24 filename
-rw-rw-r-- 1 user user     6833 dec 20 20:05 filename
-rw-rw-r-- 1 user user     6772 dec 20 18:48 filename
-rw-rw-r-- 1 user user     1226 dec 19 21:48 filename
-rwxrwxr-x 1 user user     8704 dec 18 16:23 filename
-rw-rw-r-- 1 user user 33673847 oct 17 20:50 filename
/home/user/Desktop$ /bin/ls -l | /bin/grep -
-rwxr-xr-x 1 root root 126584 feb 18  2016 /bin/ls
/home/user/Desktop$ 

注意:我已经将我的用户名更改为“用户”,将文件名更改为“文件名”。 感谢读到这里的人。 总结:我的代码只正确执行了一次命令,第二次就不能正常工作,我不知道为什么,但我想问题出在管道上。

最佳答案

我还不能发表评论,所以我将其作为答案发布。欢迎来到 SO。如果您提供一个工作示例,人们会更容易帮助您,我认为您可以。这是指南How to create a Minimal, Complete, and Verifiable example

很遗憾,我无法让您的代码正常工作。也许查看轻量级 shell 的示例实现会对您有所帮助。 Here是 xv6 shell 的源代码。搜索 PIPE 关键字。

xv6 is a re-implementation of Dennis Ritchie's and Ken Thompson's Unix Version 6 (v6).

关于c - 管道只执行一次命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250027/

相关文章:

java - 如何使用 NDK 将 Lame 3.99.5 添加到 Android Studio?

c - 函数指针线程安全吗?

linux - CentOS 6.6 上的 IPA 服务器设置失败

c - c 程序的 makefile(在 knoppix 上)

linux - 如何从 bash shell 通过 SSH 连接到多个服务器并提供完整登录?

c - UNIX 中的管道不应该是单向的吗?

c - 关于字符串的字符指针的说明

c - 交换 32 位值字节的最快(优化)方式

linux - bashrc 在运行 bash 命令之前不会加载

bash - 引用当前命令的先前参数