简体   繁体   English

UNIX shell C执行管道

[英]UNIX shell C execution of pipe

My program is supposed to take input from the terminal and execute the command for example: "ls" or "ls -l | wc" 我的程序应该从终端获取输入并执行命令,例如:“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;
    }

{...} //This is the execution of the command and parameter part: {...} //这是命令和参数部分的执行:

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
            }
   }

I am not sure what I am doing incorrectly because when I enter "ls -l | wc" I get a message saying " | not found in directory" 我不确定我做错了什么,因为当我输入“ls -l | wc”时,我收到一条消息“|在目录中找不到”

You can execute ls and wc directly with execvp, but the | 你可以直接用execvp执行ls和wc,但是| is a feature of your shell program. 是shell程序的一个特性。 So what you really need to do is run bash, and then pass as a parameter your command 所以你真正需要做的是运行bash,然后作为参数传递你的命令

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

This is so trivial though, it seems like what you're really supposed to be doing is implementing the shell yourself. 这是微不足道的,看起来你真正应该做的就是自己实现shell。 For that, you'll need to do some parsing, not just naive tokenizing with strtok. 为此,您需要进行一些解析,而不仅仅是使用strtok进行天真的标记。 If this is an assignment, I would hope they would give you clear instructions on how to do that, or at least what kinds of shell commands you need to be able to accept (just pipes? subshells maybe?). 如果这是一个任务,我希望他们会给你明确的说明,或者至少你需要接受什么样的shell命令(只是管道?子shell可能?)。 If you're just trying to implement this on your own, I would start with reading up a bit on compiler tools like lex and yacc that can help you parse shell commands and execute them. 如果你只是想自己实现这个,我会先阅读一些编译工具,比如lex和yacc ,它们可以帮助你解析shell命令并执行它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM