Grep命令在终端仿真中表现得很奇怪

时间:2015-05-27 16:33:32

标签: c linux shell pipe

我写了一个程序,旨在模拟终端,更具体地说是未命名的管道。例如,我可以模拟终端命令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;
}

有谁知道我错在哪里?

0 个答案:

没有答案