Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c中匹配字符串和execvp_C_Fork - Fatal编程技术网

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

如何在c中匹配字符串和execvp,c,fork,C,Fork,您好,我需要使用execvp()运行一个程序,问题是我得到了一个sting作为参数 我似乎无法匹配命令的语法来正常工作以下是代码: int executeUserCommand(char *command, int runInBackground) { pid_t pid; int status; pid = fork(); if (pid == 0) { //child process execvp(command, &c

您好,我需要使用
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(“./test1 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;
char*getCommand(char*commandarguments){
char命令[256];
memset(命令,0,线的最大长度);
sscanf(命令和参数,“%s”,命令);
//strncpy(命令、命令和参数、命令-命令和参数);
返回命令;
}
void commandtoarraguments(char*stringToSplit){
const char*p=stringToSplit;
int n,len;
int i=0;
对于(n=0;n<命令的最大数量;n++){
对于(len=0;len
}


commandArgumnets
被定义为全局且仍不工作

调用
execvp
要求在数组中分隔参数。您只提供了一个参数,它告诉操作系统运行名为
/test 1 2 3
的程序,而不是使用参数
/test
1
2
3
运行
/test
(是的,第0个参数应该是可执行的)

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

像这样:

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

execvp(args[0],args);

下面是另一个与函数类似的示例:()

注意如何在
main()
中设置
argv
,然后将其传递到
execute()
。还要注意用于传递
argv
的原型<代码>字符**

在您的版本中使用类似的参数类型(即字符串数组)

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 */
     }
}
void执行(字符**argv)
{
pid_t pid;
智力状态;
如果((pid=fork())<0){/*fork子进程*/
printf(“***错误:分叉子进程失败\n”);
出口(1);
}
如果(pid==0){/*子进程:*/
如果(execvp(*argv,argv)<0{/*执行命令*/
printf(“***错误:exec失败\n”);
出口(1);
}
}
else{/*对于父级:*/
while(等待(&status)!=pid)/*等待完成*/
;
}
}
真空总管(真空)
{
字符行[1024];/*输入行*/
char*argv[64];/*命令行参数*/
而(1){/*重复,直到完成*/
printf(“Shell->”);/*显示提示*/
获取(行);/*在命令行中读取*/
printf(“\n”);
解析(行,argv);/*解析行*/
if(strcmp(argv[0],“exit”)==0)/*是否为“exit”*/
退出(0);/*如果是,则退出*/
执行(argv);/*否则,执行命令*/
}
}