c - 使用 C 在 Linux Shell 中实现管道

标签 c linux shell char pipe

我正在尝试实现一个支持多管道的简单 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. 找到第一个管道参数
  2. 如果没有找到管道,则以标准输出作为输出执行数组并终止。
  3. 在非管道的第一部分和其余部分之间划分参数数组。
  4. 制作一个管道并以管道作为输出执行非管道的第一部分
  5. 从参数数组中删除非管道的第一部分和管道
  6. 转到 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/

相关文章:

python - 实现 AirDrop 协议(protocol)

c - 段错误问题

linux - 是否有任何好的桌面 linux 工具可用于查看集市分支的历史记录?

php - 如何使用 shell_exec php 创建 MySql 数据库?

linux - 为什么我在 shell 脚本中得到 "non -option ARGV element: XXXX"?

c - 以下代码有什么问题?

c++ - 为分布式系统通信设置套接字

linux - 路径变量: Find folder path of specific file

linux - 判断所有用户的shell是登录还是非登录shell

c++ - 如何定义全局函数指针并分配给特定地址