我正在尝试实现一个支持多管道的简单 shell 程序。现在我的 shell 可以实现一些简单的内置命令和外部命令。我通过从命令行获取用户输入来做到这一点,该输入由空格 ""
分隔,并将每个字符串放入 char* argv[]
中。现在的问题是执行管道。我在这个链接 http://www.cs.loyola.edu/~jglenn/702/S2005/Examples/dup2.html 中读到了一些关于它的内容.我了解它是如何工作的。
所以我想到了 strcmp
每个 argv[i]
和 "|"
当我遇到一个管道时,我 fork
一个新的进程。然后,我将管道前的字符串放在 char* argv[]
中,将管道后的字符串放在另一个 char* argv[]
中。这可能适用于 1 个管道,但如果用户输入多个管道,则使用此方法可能会变得乏味。我的主要问题是分离 pipe 两端的琴弦。关于如何实现它的任何想法?谢谢。
最佳答案
分而治之:
- 找到第一个管道参数
- 如果没有找到管道,则以标准输出作为输出执行数组并终止。
- 在非管道的第一部分和其余部分之间划分参数数组。
- 制作一个管道并以管道作为输出执行非管道的第一部分
- 从参数数组中删除非管道的第一部分和管道
- 转到 1
由于 C 数组语义,第 3 步非常简单:
char **arguments;
int pipe_position = /* for example: */ 5;
assert( strcmp( arguments[pipe_position], "|" ) == 0 );
arguments[pipe_position] = NULL;
char **my_arguments = arguments;
arguments = arguments + pipe_position + 1;
然后 my_arguments 是一个长度为 pipe_position
的数组,其中包含第一个参数,而 arguments
是一个长度为 argc - pipe_position - 1
的数组包含其余部分。您可以毫无问题地将这些指针提供给 execvp。是的,它们指向同一个内存块,但这不是 execvp 所关心的。
关于c - 使用 C 在 Linux Shell 中实现管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8278572/