我是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'的文件名称。 谢谢谁读这个。 总结:我的代码只执行一次正确的命令,第二次它没有正常工作,我不知道为什么,但我想问题是管道。
答案 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,我解决了这个问题,这是一个参数初始化的问题。这是一个我没有写的功能,因为我认为它有效。 我现在唯一的疑问是为什么甚至能够执行...... 谢谢大家回答我。