UNIX shell C 管道的执行

发布于 2024-12-10 15:10:04 字数 2069 浏览 0 评论 0原文

我的程序应该从终端获取输入并执行命令 例如:“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”时wc”我收到一条消息“| 在目录中找不到”

My program is supposed to take input from the terminal and execute the command
for example: "ls" or "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"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心是晴朗的。 2024-12-17 15:10:04

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

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

虽然这很简单,但看起来你真正应该做的是自己实现 shell。为此,您需要进行一些解析,而不仅仅是使用 strtok 进行简单的标记化。如果这是一项作业,我希望他们能为您提供有关如何执行此操作的明确说明,或者至少您需要能够接受哪些类型的 shell 命令(只是管道?也许是子 shell?)。如果您只是想自己实现这一点,我会首先阅读一些编译器工具,例如 lex 和 yacc 可以帮助你解析 shell 命令并执行它们。

You can execute ls and wc directly with execvp, but the | is a feature of your shell program. So what you really need to do is run bash, and then pass as a parameter your command

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. For that, you'll need to do some parsing, not just naive tokenizing with 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?). 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文