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

tub*_*u13 2 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;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用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;
Run Code Online (Sandbox Code Playgroud)

}

commandArgumnets 被定义为全局但仍无效

tyl*_*erl 8

execvp呼叫预计参数在阵列中分离出来.你只提供一个参数,它告诉OS运行调用程序./test 1 2 3,而不是运行./test与参数./test,1,2,和3(是的,第0个参数应该是可执行文件).

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

像这样:

char* args[5];
args[0]="./test";
args[1]="1";
args[2]="2";
args[3]="3";
args[4]=NULL;

execvp(args[0],args);
Run Code Online (Sandbox Code Playgroud)