如何在c中匹配字符串到execvp

时间:2014-05-01 22:04:56

标签: c fork

您好我需要使用execvp()运行一个程序,事实是我得到一个sting作为参数 我似乎无法匹配命令的语法,以正常工作这里是代码:

int executeUserCommand(char *command, int runInBackground) {
    pid_t pid;
    int status;
    pid = fork();
    if (pid == 0) {
        //child process
        execvp(command, &command);
        exit(1);
    } else {
       //perent
       if (!runInBackground) {
           waitpid(pid, &status, 0);
           return WEXITSTATUS(status);
       }
    }
    return 0;
}

我正在使用executeUserCommand("./test 1 2 3", 0) 问题是程序正在运行但没有参数.. 问题是什么以及我如何解决它?

编辑: 我已经添加了两个功能来帮助我进行拆分,但它仍无法正常工作。

char *getCommand(char *commandAndArguments) {
    char command[256];
    memset(command,0,MAX_LENGTH_OF_LINE);
    sscanf(commandAndArguments,"%s ", command);
    //strncpy(command, commandAndArguments, command - commandAndArguments);
    return command;
}

void commandToArrguments(char *stringToSplit) {
  const char *p = stringToSplit;
  int n, len;
  int i = 0;
  for (n = 0; n < MAX_NUMBER_OF_COMMANDS; n++) {
    for (len=0; len < MAX_LENGTH_OF_LINE-1; len++) {
      if (p[0] == '\0') {
        break;
      }
      if (p[0] == ' ') {
        p += 1;
        break;
      }

      commandArgumnets[n][len] = *p;
      p++;
    }
    commandArgumnets[n][len] = '\0';
  }
}

int executeUserCommand(char *command, int runInBackground) {
pid_t pid;
int status;
pid = fork();
char *commandToExecute = getCommand(command);
if (pid == 0) {
    //child process
    execvp(commandToExecute, commandArgumnets);
    exit(1);
} else {
    //perent
    if (!runInBackground) {
        waitpid(pid, &status, 0);
        return WEXITSTATUS(status);
    }
}
return 0;

}

commandArgumnets被定义为全局且仍无效

2 个答案:

答案 0 :(得分:8)

execvp调用期望参数在数组中分离出来。您只提供一个参数,它告诉操作系统运行名为./test 1 2 3的程序,而不是使用参数./test./test,{{1}运行1 }和2(是的,第0个参数应该是可执行文件)。

因此,您需要通过将命令拆分为单独的参数来构造字符串数组(可能在所有空格中拆分,也许需要考虑引号)。你如何做到这一点取决于你。数组中的每个字符串应该只是一个没有空格的参数。

像这样:

3

答案 1 :(得分:0)

以下是与您的函数类似的另一个示例:(From Here

注意argvmain()的设置方式,然后传递给execute()。另请注意原型用于传递argv ... char **
在您的版本中使用类似的参数 类型(即字符串数组)。

void  execute(char **argv)
{
     pid_t  pid;
     int    status;

     if ((pid = fork()) < 0) {     /* fork a child process           */
          printf("*** ERROR: forking child process failed\n");
          exit(1);
     }
     else if (pid == 0) {          /* for the child process:         */
          if (execvp(*argv, argv) < 0) {     /* execute the command  */
               printf("*** ERROR: exec failed\n");
               exit(1);
          }
     }
     else {                                  /* for the parent:      */
          while (wait(&status) != pid)       /* wait for completion  */
               ;
     }
}

void  main(void)
{
     char  line[1024];             /* the input line                 */
     char  *argv[64];              /* the command line argument      */

     while (1) {                   /* repeat until done ....         */
          printf("Shell -> ");     /*   display a prompt             */
          gets(line);              /*   read in the command line     */
          printf("\n");
          parse(line, argv);       /*   parse the line               */
          if (strcmp(argv[0], "exit") == 0)  /* is it an "exit"?     */
               exit(0);            /*   exit if it is                */
          execute(argv);           /* otherwise, execute the command */
     }
}