【发布时间】:2011-12-26 08:16:01
【问题描述】:
我正在尝试在 C 中实现一个 shell。我可以使用简单的 execvp() 来执行简单的命令,但其中一个要求是管理这样的命令:“ls -l | head | tail -4”一个“for”循环,并且只有一个“pipe()”语句重定向标准输入和标准输出。现在几天过去了,我有点迷路了。
N = 简单命令的数量(示例中为 3:ls、head、tail) commands = 带有命令的结构列表,如下所示:
commands[0].argv[0]: ls
commands[0].argv[1]: -l
commands[1].argv[0]: head
commands[2].argv[0]: tail
commands[2].argv[1]: -4
所以,我创建了 for 循环,并开始重定向标准输入和标准输出,以便将所有命令与管道连接,但是......我只是不知道为什么它不起作用。
for (i=0; i < n; i++){
pipe(pipe);
if(fork()==0){ // CHILD
close(pipe[0]);
close(1);
dup(pipe[1]);
close(pipe[1]);
execvp(commands[i].argv[0], &commands[i].argv[0]);
perror("ERROR: ");
exit(-1);
}else{ // FATHER
close(pipe[1]);
close(0);
dup(pipe[0]);
close(pipe[0]);
}
}
我想要创建的是子进程的“行”:
[ls -l] ----pipe----> [head] ----pipe----> [tail -4]
所有这些进程都有一个根(运行我的shell的进程)所以,第一个父亲也是shell进程的一个孩子,我已经有点累了,有人可以帮我吗?
我什至不确定孩子是否应该是执行命令的人。
谢谢大家!!
【问题讨论】:
-
这是作业吗?如果不是 - 只需使用适当的参数运行
/bin/sh。为什么要重新发明轮子? -
这只是 3 页长的自愿实践的要求之一。不完全是家庭作业,但我想知道如何做,或者至少得到一些线索。
-
在 S.O. 上有很多好帖子。涵盖了您掌握该主题所需的背景材料。祝你好运。
-
@user1031296 你能把完整的代码贴出来