gpt4 book ai didi

c - 管道只执行一次命令

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:08 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com