0

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"

user1003749
  • 61
  • 3
  • 8

1 Answers1

2

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.

deontologician
  • 2,764
  • 1
  • 21
  • 33