execl中的C程序的否定参数被检测为一个选项

时间:2011-05-12 18:31:46

标签: c floating-point arguments

我在调用中使用execl()函数:

execl("/localhome/globususer/mandel", "-b", xmin, xmax, ymin, ymax, "-f", name, (char*)NULL);

所有xmin,xmax,ymin,ymax都通过以下方式初始化:

sprintf(xmin, "%f", (double)(XPOS - realmargin));
sprintf(xmax, "%f", (double)(XPOS + realmargin));
sprintf(ymin, "%f", (double)(YPOS - realmargin));
sprintf(ymax, "%f", (double)(YPOS + realmargin));

在目标程序(/ localhome / globususer / mandel)中,xmin和ymin被检测为选项,因为它们是负数。 因此getopt()会在其值上检测到“-0”,并引发错误。

但是,从命令行直接调用,如:

./mandel -b -0.452902 0.456189 0.367922 1.277013 -f /localhome/globususer/mandel.ppm
程序正确理解

有人有任何想法吗?

1 个答案:

答案 0 :(得分:4)

您错误地使用了execl()。您应该将arg0设置为可执行文件的名称:

execl("/localhome/globususer/mandel",
      "/localhome/globususer/mandel",
      "-b",
      xmin, 
      xmax, 
      ymin, 
      ymax, 
      "-f", 
      name, 
      NULL);

来自man page

  

const char *arg 以及 execl() execlp() 中的后续省略号> execle() 函数可以被认为是 arg0,arg1,...,argn 。它们一起描述了一个或多个指向以null结尾的字符串的指针的列表,这些字符串表示执行程序可用的参数列表。按照惯例,第一个参数应指向与正在执行的文件关联的文件名。

mandel与原始参数列表一起运行getopt()时,它会跳过-b(因为它位于argv[0]中,并且它认为是可执行路径名),因此,开始使用数字(在您的示例中为-0.452902)而不是-b解析args。这使得它将-0解释为一个选项,而且你运气不好。