我的linux(Ubuntu)的手册页,没有提到需要NULL作为最后一个参数,minix版本execl
的手册页提到需要NULL作为最后一个参数。然而,我在调用modprobe
时遇到了奇怪的行为,我解决了将NULL作为最后一个参数的问题。
对我有用的方式:
execl("/sbin/modprobe","modprobe","pl2303",NULL);
如果我这样做的话:
execl("/sbin/modprobe","modprobe","pl2303")
我收到错误号14(EFAULT).`
答案 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/1938163,http://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。