管道只执行一次命令

时间:2016-12-20 19:38:05

标签: c linux bash shell

我是StackOverflow的新手,并在C中学习管道。我试图创建一个shell插件,允许引入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$ 

注意:我已经更改了用户的用户名'以及' filename'的文件名称。 谢谢谁读这个。 总结:我的代码只执行一次正确的命令,第二次它没有正常工作,我不知道为什么,但我想问题是管道。

2 个答案:

答案 0 :(得分:1)

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

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

  
    

xv6是Dennis Ritchie和Ken Thompson的Unix的重新实现     第6版(第6版)。

  

答案 1 :(得分:1)

Oke,我解决了这个问题,这是一个参数初始化的问题。这是一个我没有写的功能,因为我认为它有效。 我现在唯一的疑问是为什么甚至能够执行...... 谢谢大家回答我。