【问题标题】:Does `execl` need NULL as last parameter?`execl` 是否需要 NULL 作为最后一个参数?
【发布时间】:2014-03-21 22:58:27
【问题描述】:

我的 linux (Ubuntu) 的手册页,没有提到需要 NULL 作为最后一个参数,minix 版本的手册页execl 提到需要 NULL 作为最后一个参数。然而,我在调用 modprobe 时遇到了奇怪的行为,我解决了将 NULL 作为最后一个参数的问题。

对我有用的方式:

execl("/sbin/modprobe","modprobe","pl2303",NULL);

如果我这样做:

execl("/sbin/modprobe","modprobe","pl2303")

我收到第 14 号错误(EFAULT)。`

【问题讨论】:

  • 再次检查您的手册页。
  • 抛开手册页说的,想想看:execl 需要有一些方法来检测参数列表的结尾。

标签: c linux


【解决方案1】:

我的 Linux 上的手册页确实明确说明了这一点:

execl() 中的 const char *arg 和后续省略号, execlp() 和 execle() 函数可以被认为是 arg0, arg1, ..., 阿根。 [....]

参数列表必须由 NULL 指针终止,并且,因为 这些是可变参数函数,此指针必须强制转换 (char *) NULL。

恕我直言 Linux 和 Minix,我认为更权威的页面是来自 opengroup 的页面,上面写着:

由 arg0,... 表示的参数是指向空终止的指针 字符串。这些字符串应构成参数列表 可用于新的过程映像。 列表以 null 结尾 指针

【讨论】:

  • 我虽然它只是指命令的 execv 版本。但是知道我看到它在 execl 段落中重复了这个语句。
【解决方案2】:

第一个参数是可执行文件的路径,后面的参数实际上是执行程序的argv。这些参数的列表以(char*)0

结尾

从手册页引用:

名单 参数必须由一个空指针终止,并且,因为这些是 可变参数函数,此指针必须强制转换 (char *) NULL。

另请参考:https://stackoverflow.com/a/12677236/1938163http://man7.org/linux/man-pages/man3/exec.3.html

【讨论】:

    【解决方案3】:

    是的,确实如此,main 的 ISO C 标准要求 argv[argc] 应为 NULL 以允许程序在末尾使用 argc 或标记,同样的推理适用于 @987654325 @-like 调用。

    可以在http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html 找到这方面的 POSIX 文档,他们声明:

    argv 和 environ 数组均由空指针终止。终止 argv 数组的空指针不计入 argc。

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 2021-05-20
      • 1970-01-01
      • 2013-02-03
      • 2017-04-19
      • 2013-08-10
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多