我正在尝试用C语言实现一个shell。使用简单的execvp()可以正常执行简单命令,但其中一个要求是使用'for'循环和只有一个'pipe()'语句来处理像这样的命令:"ls -l | head | tail -4"。经过数天的尝试,我有些迷失了。
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]);
}
}
我想要创建的是一个“子进程链”,如下所示:
所有这些进程都有一个根进程(即运行我的shell的进程),因此,第一个父进程也是shell进程的子进程。我已经感到有点疲惫了,请问有人可以帮助我吗?[ls -l] ----管道----> [head] ----管道----> [tail -4]
我甚至不确定子进程是否应该执行命令。
谢谢大家!!
/bin/sh
。为什么要重复造轮子呢? - Ed Heal