【问题标题】:UNIX shell C execution of pipeUNIX shell C 执行管道
【发布时间】:2011-12-11 10:10:24
【问题描述】:

我的程序应该从终端获取输入并执行命令 例如:“ls”或“ls -l | wc”

{...}

//Split the command and store each string in parameter[]
    parameter[0] = malloc(255);                     //Allocate some space to the first element in the array
    cp = strtok(command, " ");                      //Get the initial string (the command)
    strncpy(parameter[0], cp, 50);
    for(i = 1; i < MAX_ARG; i++)
    {
        parameter[i] = malloc(255);
        cp = strtok(NULL, " ");                 //Check for each string in the array
        parameter[i] = cp;                      //Store the result string in an indexed off array
        if(strcmp(parameter[i], "|") == 0)
        {
            i = MAX_ARG;
            cp = strtok(NULL, " ");
            parameter2[0] = malloc(255);
            strncpy(parameter2[0], cp, 50);
            break;
        }
        if(parameter[i]  == NULL)
        {
            break;
        }
    }

    //Find the second set of commands and parameter
    //strncpy(parameter2[0], cp, 50);
    for (j = 1; j < MAX_ARG; j++)
    {
        parameter2[j] = malloc(255);
        cp = strtok(NULL, " ");
        parameter2[j] = cp;
    }

{...} //这是命令和参数部分的执行:

if (proc1 ==  0)
        {
            close(fd[0]);                           //process1 doenst need to read from pipe
            close(STD_INPUT);                       //prepare for output
            dup(fd[1]);                             //Standard output = fd[1]
            close(fd[1]);
            execvp(parameter[0], parameter);        //Execute the process
        }


 else {
if (proc2 == 0)
            {
                close(fd[1]);
                close(STD_OUTPUT);
                dup(fd[0]);
                close(fd[0]);
                execvp(parameter2[0], parameter2);
            }
            //Parent process
            else
            {
            waitpid(-1, &status, 0);            //Wait for the child to be done
            }
   }

我不确定我做错了什么,因为当我输入“ls -l | wc”时,我收到一条消息“|在目录中找不到”

【问题讨论】:

标签: c shell unix command pipe


【解决方案1】:

您可以使用 execvp 直接执行 ls 和 wc,但 | 是您的 shell 程序的一个功能。所以你真正需要做的是运行 bash,然后将你的命令作为参数传递

execl("/bin/bash","-c",command);

不过,这太微不足道了,看起来你真正应该做的是自己实现 shell。为此,您需要进行一些解析,而不仅仅是使用 strtok 进行简单的标记化。如果这是一项任务,我希望他们会给您明确的指示,说明如何执行此操作,或者至少您需要能够接受哪些类型的 shell 命令(只是管道?可能是子shell?)。如果你只是想自己实现这个,我会先阅读一些编译器工具,比如lex and yacc,它可以帮助你解析shell命令并执行它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 2012-12-06
    • 2015-06-04
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多