我是 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/