2015-10-11 117 views
1

命令我有命令字符串我想执行的数组通过调用execvp()执行与execvp

char* commands[] = ["ls -l", "ps -a", "ps"]; 
char* command = commands[0]; 
... 

如何执行与execvp的命令?

+2

你必须单独的命令和参数为单独的字符串:你希望每个命令行'{ “LS”, “-l”,NULL}'和'fork()的'和'execvp()'一次执行。你最后缺少一个'NULL'指针。 char * commands []'数组的最后一项必须是NULL指针。 –

+1

如果您要从命令行运行命令,它会是什么样子? – dbush

+0

如果我要从命令行运行它,它只会是“ls -l” – user3133300

回答

1

以下是您可能的使用示例。这需要命令从其参数中执行,或者您可以取消注释硬编码示例。

我建议您在各自的手册页中查找使用的命令。 对于execvp,声明是

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

argv[0]应该是一样file按照惯例和argv应该是NULL封端的。

#include <stdlib.h> //exit 
#include <stdio.h> //perror 
#include <unistd.h> 
#include <sysexits.h> 
#include <errno.h> 
#include <sys/wait.h> 

int main(int argc, char** argv){ 
    int pid, status, ret; 
    if((pid=fork())<0) { perror("fork"); exit(EX_OSERR); } 

    if(!pid){ //Child 

    /* 
     char* args[] = { "ps", "-a", (char*)0 }; 
     execvp(args[0], args); 
    */ 

     //Execute arguments, already NULL terminated 
     execvp(argv[1], argv+1); 

    //exec doesn't exit; if it does, it's an error 
     perror(argv[1]); 

    //Convert exec failure to exit status, shell-style (optional) 
     switch(errno){ 
      case EACCES: exit(126); 
      case ENOENT: exit(127); 
      default:   exit(1); 
     } 
    } 

    //Wait on child 
    waitpid(pid, &status, 0); 

    //Return the same exit status as child did or convert a signal termination 
    //to status, shell-style (optional) 

    ret = WEXITSTATUS(status); 
    if (!WIFEXITED(status)) { 
     ret += 128; 
     ret = WSTOPSIG(status); 
     if (!WIFSTOPPED(status)) { 
      ret = WTERMSIG(status); 
     } 
    } 
    return ret; 
}