管道而不创建特定的管道描述符

时间:2017-04-21 22:32:35

标签: c shell pipe piping

我有一个在C上复制shell命令的项目。其中一个命令是|需要使用管道制作。我的其他命令有效但我无法使(ls | sort)工作。它说 ls无法访问|:没有这样的文件或目录 ls无法访问sort:没有这样的文件或目录

我希望有人可以帮我弄清楚如何解决管道问题?它开始尝试使它,所以我不必为每个命令创建一个单独的管道,所以我通过for循环运行它。

执行大部分工作的功能。 Runsource和Rundest在管道中打开和传输信息。

void execute(char *cmdline)
{
    int pid, async;
    char *args[MAX_ARGS];
    char *pargs[MAX_ARGS];
    int i = 1;
    int j;

    int nargs = get_args(cmdline, args);
    if (nargs <= 0)
        return;

    if (!strcmp(args[0], "quit") || !strcmp(args[0], "exit"))
    {
        exit(0);
    }

    int npargs = get_pipe(cmdline, pargs);
    if (npargs > 1)
    {
        int pdes[2];
        pipe(pdes);

        for (j = 0; i < npargs; j++)
        {
            nargs = get_args(pargs[j], pargs);
            runsource(pdes, j, pargs, npargs);
            rundest(pdes, j + 1, pargs, npargs);
            close(pdes[0]);
            close(pdes[1]);
        }
    }
    else
    {
        while (args[i] < args[nargs])
        {
            if (strcmp(args[i], ">"))
            {
                freopen(args[i + 1], "w", stdout);
                args[i] = NULL;
            }

            if (strcmp(args[i], ">>"))
            {
                freopen(args[i + 1], "a", stdout);
                args[i] = NULL;
            }

            if (strcmp(args[i], "<"))
            {
                freopen(args[i + 1], "r", stdin);
                args[i] = NULL;
            }
        }
    }


    /* check if async call */
    if (!strcmp(args[nargs - 1], "&"))
    {
        async = 1;
        args[--nargs] = 0;
    }
    else
        async = 0;

    pid = fork();
    if (pid == 0) /* child process */
    {
        execvp(args[0], args);
/* return only when exec fails */
        perror("exec failed");
        exit(-1);
    }
    else if (pid > 0) /* parent process */
    {
        if (!async)
            waitpid(pid, NULL, 0);
        else
            printf("this is an async call\n");
    }
    else /* error occurred */
    {
        perror("fork failed");
        exit(1);
    }
}

int main(int argc, char *argv[])
{
    char cmdline[BUFFSIZE];

    for ( ; ; )
    {
        printf("COP4338$ ");
        if (fgets(cmdline, BUFFSIZE, stdin) == NULL)
        {
            perror("fgets failed");
            exit(1);
        }
        execute(cmdline);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我看到你有特殊的代码来处理&#34;&lt;&#34;和&#34;&gt;&#34;符号,但我没有在你的答案中看到处理&#34; |&#34;的任何代码,那么你甚至期望它如何工作?现在的问题是你正在通过&#34; |&#34;作为ls的参数,实际上你应该在管道之后运行该事物作为将ls的标准输出发送到该命令的标准输入的命令。

为什么要通过解析内容并手动设置管道来尝试从头开发shell?您不能仅使用system()来执行shell命令吗?