execl 中 C 程序的负参数被检测为选项

发布于 2024-11-06 15:26:32 字数 708 浏览 1 评论 0原文

我在该调用中使用了 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

但是,程序可以正确理解

有人有什么想法吗?

I use the execl() function with that call:

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

All the xmin, xmax, ymin, ymax are initialized by:

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

In the targeted program (/localhome/globususer/mandel), xmin and ymin are detected as options since they are negative numbers.
So getopt() detects "-0" on their values, and raises an error.

However, a direct call from the command line such as:

./mandel -b -0.452902 0.456189 0.367922 1.277013 -f /localhome/globususer/mandel.ppm

is correctly understood by the program.

Does anybody have any idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

若沐 2024-11-13 15:26:32

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

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

来自手册页< /a>:

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


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

You' re using execl() incorrectly. You should set arg0 to the name of the executable:

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

From the man page:

The const char *arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn. Together they describe a list of one or more pointers to null-terminated strings that represent the argument list available to the executed program. The first argument, by convention, should point to the filename associated with the file being executed.

When mandel runs getopt() with your original argument list, it skips over the -b (since it's in argv[0], and it thinks that's the executable path name), and therefore starts parsing the args with the number (-0.452902 in your example) instead of the -b. That makes it interpret the -0 as an option, and you're out of luck.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文