简体   繁体   中英

Executing a separated command using execvp in C

I've separated a given command from the user into substrings , here's the code :

     int i;

     char *line = malloc(BUFFER);
     char *origLine = line;
     fgets(line, 128, stdin);   // get a line from stdin


     // get complete diagnostics on the given string

     lineData info = runDiagnostics(line);

     char command[20];
     sscanf(line, "%20s ", command);
     line = strchr(line, ' ');

     printf("The Command is: %s\n", command);

     int currentCount = 0;                  // number of elements in the line
     int *argumentsCount = &currentCount;   // pointer to that


     // get the elements separated

     char** arguments = separateLineGetElements(line,argumentsCount);


     // here we call a method that would execute the commands


    if (execvp(*arguments,*argumentsCount)  < 0)       // execute the command
    {
                printf("ERROR: exec failed\n");
                exit(1);
    }

When I execute the command in execvp(*arguments,*argumentsCount) , it fails .

What's wrong ?

Thanks .

EDIT :

The input from the user is : ls > a.out , hence I have 3 strings , which are :

ls , > , a.out , and it fails .

Shell redirection won't work if you aren't invoking a shell. You also won't have path searching to find the ls program. Some options

  • use system() instead, and exit when it returns

  • exec a shell and have it run your command

  • setup redirection as a shell would, then fork and execute each required child program.

Also your command doesn't make a lot of sense, you probably want ¦ instead of > and may need to specify the directory of a.out if it is not in your path. Consider giving it a meaningful name as well.

When you run ls > a.out at the command-line, > and a.out are not arguments passed to the application; they're interpreted by the shell to redirect stdout.

So in short, it is not possible to do what you want to do. 1


1. Well, it is, but not this way. Your application would need to interpret the arguments, create the file, and set up a stream redirect.

From man page of execvp command:

   int execvp(const char *file, char *const argv[]);

The second argument is a list of null-terminated C-strings as arguments to the command to be executed by execvp . But in your code, you pass an int as the second argument which is wrong.

If you have list of arguments in the variable arguments then call execvp as:

execvp(arguments[0],arguments);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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