我需要一些帮助来模拟unix中的"|"命令。我需要能够使用第一个参数的输出作为第二个参数的输入,像ls这样简单的东西。到目前为止,我得到了这些代码,但我只是在这一点上卡住了。任何帮助都是有帮助的。-谢谢。
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char ** words)
{
char** args;
char *cmd1[2] = { words[1], 0 };
char *cmd2[2] = { words[2], 0 };
int colon, arg1 ,i, pid, status;
int thepipe[2];
char ch;
args = (char **) malloc(argc*(sizeof(char*)));
colon = -1;
for (i=0;(i<argc); i=i+1){
if (strcmp(words[i],":") == 0) {
colon = i;
}
else {}
}
pipe(thepipe);
arg1 = colon;
arg1 = arg1 - 1;
for (i=0;(i<arg1); i=i+1){
args[i] = (char*) (malloc(strlen(words[i+1])+1));
strcpy(args[i], words[i+1]);
}
args[argc] = NULL;
pid = fork();
if (pid == 0) {
wait(&pid);
dup2(thepipe[1], 1);
close(thepipe[0]);
printf("in newn");
execvp(*args, cmd1);
}
else {
close(thepipe[1]);
printf("in oldn");
while ((status=read(thepipe[0],&ch,1)) > 0){
execvp(*args, cmd2);
}
}
}
假设argv[1]
是一个单字命令(如ls
), argv[2]
是第二个单字命令(如more
),则:
- 创建管道
- Fork第一个子进程。
- Fork第二个子进程。
- 关闭管道两端
- 父级等待两个子级死亡,报告他们的退出状态,并退出自己。
子1
- 将管道的写端复制到标准输出。
- 关闭管道两端
- 使用
execvp()
执行argv[1]
中的命令。 - 退出,可能有一个错误消息写入标准错误(如果
execvp()
返回)。
子2
- 将管道的读端复制到标准输入。
- 关闭管道两端
- 使用
execvp()
执行argv[2]
中的命令。 - 退出,可能有一个错误消息写入标准错误(如果
execvp()
返回)。
char cmd1[2] = { argv[1], 0 };
char cmd2[2] = { argv[2], 0 };
作为第二个参数传递给execvp()
。
注意,这个大纲并没有把字符串分开。如果您想处理如下调用:
./execute "ls -la" "wc -wl"
则需要将每个参数拆分为单独的单词,并为cmd1
和cmd2
创建更大的数组。如果希望处理两个以上的命令,则需要非常仔细地考虑如何管理管道中的额外阶段。第一个和最后一个命令与中间的命令不同(所以3个进程有三种不同的机制,但是4个或更多的进程除了第一个和最后一个命令外,基本上都使用相同的机制)。