`execl`是否需要NULL作为最后一个参数?

时间:2014-03-21 22:58:28

标签: c linux

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

对我有用的方式:

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

如果我这样做的话:

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

我收到错误号14(EFAULT).`

3 个答案:

答案 0 :(得分:6)

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

  

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

     

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

对Linux和Minix充分尊重,我认为更具权威性的页面来自opengroup,它说:

  

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

答案 1 :(得分:2)

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

终止

引用手册页:

  

列表          参数必须由空指针终止,因为它们是          可变参数函数,必须将此指针强制转换为(char *)NULL。

同时引用:https://stackoverflow.com/a/12677236/1938163http://man7.org/linux/man-pages/man3/exec.3.html

答案 2 :(得分:2)

是的,ISO C标准要求main argv[argc]应为NULL,以允许程序在最后使用argc或哨兵,并且相同推理适用于exec - 类似的电话。

可以在http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html找到POSIX文档,并说明:

  

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