execv()在pass(char *)而不是(char * const)时不起作用

时间:2015-11-07 14:11:53

标签: c

我有一个类似打击的程序:

int main()
 {
   char  * const args[2]={"a", "b",};

   int pid = fork();

   if ( pid == 0 ) {
      execv("./printargs", args);
}

return 0;
}

当我从终端运行它时。 execv()执行printargs并打印agrs []的所有值。所以程序运行正常。

但是当我稍微更改程序以接受输入并重新编写程序时如下:

int main()
 {
   char  * args[2];

   args[0] = (char*)malloc(sizeof(char)*10);
   args[1] = (char*)malloc(sizeof(char)*10);

   scanf("%s", args[0]);
   scanf("%s", args[1]);

   int pid = fork();

   if ( pid == 0 ) {
      execv("./printargs", args);
}

return 0;
}

然后execv()没有工作&我不明白是什么问题

但我需要通过从输入中获取值来动态传递args。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

所以我在这里说你有以下问题:

  • execv需要第二个参数作为以NULL结尾的数组(所以最后一个值必须是NULL值)
  • 此参数也以"程序名称"开头。所以真正的第一个参数(如你所愿)是args[1]而不是args[0]
  • 您还应检查错误并检查返回值
  • 请注意%10s表示scanf最多可读取10个字符+之后添加前导\0,因此可能是11个字符!使用%9s或增加分配大小

以下示例代码执行大致相同(使用/bin/echo命令而不是./prinargs):

int main()
{
  char  * args[4];  // 1 for bin name, 2 for args, 1 for NULL
  args[0] = "/bin/echo";  // you may put what you want here, in fact
  args[1] = (char*)malloc(sizeof(char)*10);
  args[2] = (char*)malloc(sizeof(char)*10);
  args[3] = NULL;  // NULL-terminated

  scanf("%9s", args[1]); // read 9 (+1 for \0)
  scanf("%9s", args[2]);

  int pid = fork();

  if (pid == -1) {  // handle fork() error
    perror("fork");  // print out the reason
    exit(1); // and leave
  } else if (pid == 0) {
    // child
    execv("/bin/echo", args);
    perror("execv"); // we are here only if execv failed
    exit(1);         // so print out error and exit
  }
  // here you should wait for your child to get returned value
  // see wait() and similar functions 
  return 0;
}

大部分时间最好等孩子(使用wait()家庭),以便父亲不会在孩子面前结束,你也可以获得其返回状态(即如果exit()失败,则返回您执行的命令或execv()值。