我写了一个程序,旨在模拟终端,更具体地说是未命名的管道。例如,我可以模拟终端命令cat文件| grep' aa' 使用命令
./ myterminal cat file - grep' aa'
(我将参数与 - 而不是|)分开。而且效果很好。但是,如果我尝试使用该命令 ./myterminal cat file - grep' aa' - grep' bb'
我收到错误信息:
用法:aa [OPTION] ... PATTERN [FILE] ... 试试' aa - help'了解更多信息。
显然有些事情是错的。当我尝试命令时 ./myterminal cat file - grep' aa' '文件' - grep' bb' '文件'
打印文件中的正确行 - 但错误消息也是如此。这里发生了什么?显然我的程序有问题,我只是不明白什么。程序本身很简单,我不确定这里出了什么问题。
代码本身是:
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <assert.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
void np_exec(char* cmd, char** argv)
{
int fd[2];
while(*(++argv) != NULL)
{
pipe(fd);
int pid = fork(); //parent executes
if(pid < 0)
{
printf("Error forking");
exit(1);
}
if(pid != 0) // parent
{
dup2(fd[1],1);
close(fd[0]);
if (execvp(cmd, argv) == -1)
{
perror("execvp failed");
}
}
else
{
dup2(fd[0],0);
close(fd[1]);
}
}
}
int main(int argc, char** argv)
{
assert(strcmp(argv[argc-1], "-"));
int i;
for (i = 1; i < argc; ++i) {
if (!strcmp(argv[i], "-"))
{
argv[i] = NULL;
np_exec(argv[1], &argv[1]);
argv = &argv[i];
argc -= i;
i = 0;
}
}
char* args[argc];
args[argc-1] = NULL;
for (i = 1; i < argc; ++i) {
args[i-1] = argv[i];
}
if (execvp(args[0], args) == -1)
perror("execvp failed");
return 0;
}
有谁知道我错在哪里?