我在调用中使用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
程序正确理解。
有人有任何想法吗?
答案 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
解释为一个选项,而且你运气不好。