Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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
当传入(char*)而不是(char*const)时,execv()不起作用_C - Fatal编程技术网

当传入(char*)而不是(char*const)时,execv()不起作用

当传入(char*)而不是(char*const)时,execv()不起作用,c,C,我有一个类似blow的程序: int main() { char * const args[2]={"a", "b",}; int pid = fork(); if ( pid == 0 ) { execv("./printargs", args); } return 0; } 当我从终端运行它时。execv()执行printargs并打印agrs[]的所有值。所以程序运行正常 但当我稍微更改程序以获取输入并重新编写程序时,如下所示: int main(

我有一个类似blow的程序:

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()不起作用&我不明白问题出在哪里

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


提前感谢您的帮助。

正如我所说,您有以下问题:

  • execv
    需要以NULL结尾的数组作为第二个参数(因此最后一个值必须是NULL值)
  • 此参数也以“程序名”开头,因此实际的第一个参数(如您所愿)是
    args[1]
    ,而不是
    args[0]
  • 您还应该检查错误和返回值
  • 请注意,
    %10s
    意味着
    scanf
    将最多读取10个字符,然后添加一个前导的
    \0
    ,因此可能是11个字符!使用
    %9s
    或增加分配大小
下面是执行基本相同的示例代码(使用
/bin/echo
命令而不是
/prinargs
):


大多数情况下,最好等待孩子(使用
wait()
family),这样父亲就不会在孩子(ren)之前结束,您也可以获得其返回状态(即,返回您执行的命令,或者如果
execv()
失败,则返回您的
exit()
值)。

什么是“不工作”?发生了什么?读取execv手册页的内容。第二个参数必须是以NULL结尾的列表。不能以NULL值(
args[2]=NULL;
并将其声明为
char*args[3];
).“return 0”对于父级来说是可以的,但是对于子级来说可能是错误的。如果execv失败并且返回被执行,那么这似乎是失败的。因为在您的情况下execv似乎失败了,也许您应该在execv之后调用
peror
,让系统告诉您失败的原因。不要在C中强制转换
malloc
&friends的结果!而且
sizeof(char)
是无用的/错误的,因为它保证总是产生
1
。此外,
execv
的主页说明args中的第一个值类似于main的
argv[0]
:二进制文件的名称。因此args必须进入
args[1]
…我明白了,现在它对我有效,但我面临另一个问题,请改进我的程序。如果您有新问题,请自行搜索,如果您确实找不到解决方案,请询问其他问题。
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;
}