首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ubuntu中的execl()参数

Ubuntu中的execl()参数
EN

Stack Overflow用户
提问于 2012-10-02 00:17:39
回答 5查看 30.7K关注 0票数 8

我正在学习linux编程,偶然发现了一个非常有用的exec函数。但问题是exec函数参数非常令人困惑,我无法掌握哪个参数是用于什么目的。在下面的代码中,从通过fork()创建的子级调用execl()函数,execl()中最后一个参数(NULL)的用途是什么

代码语言:javascript
复制
execl("/bin/ls","ls","-l",NULL);

如果有人能解释NULL参数和其他参数的用途以及exec()族函数的参数的用途,那将对我有很大的帮助!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-02 00:25:47

创建未定义的行为。这不是对execl的合法调用。正确的调用可能是:

代码语言:javascript
复制
execl( "/bin/ls", "ls", "-l", (char*)0 );

最后一个参数必须为(char*)0,否则具有未定义的行为。第一个参数是可执行文件的路径。以下参数出现在已执行程序的argv中。这些参数的列表由(char*)0终止;这就是被调用的函数知道最后一个参数已经到达的原因。例如,在上面的示例中,"/bin/ls"处的可执行文件将替换您的代码;在其main中,它的argc等于2,argv[0]等于"ls"argv[1]等于"-l"

在此函数之后,您应该立即拥有错误处理代码。(当execl返回时,它总是返回-1,所以您不需要测试它。并且只有在出现某种错误时才会返回。)

票数 17
EN

Stack Overflow用户

发布于 2012-10-02 00:19:07

exec函数是可变的:它们接受数量可变的参数,以便您可以将数量可变的参数传递给命令。函数需要使用NULL作为标记来标记参数列表的末尾。

在可变函数中有一个循环,它将遍历可变数量的参数。这些循环需要一个终止条件。在某些情况下,例如printf,可以从另一个参数中推断出实际的参数数量。在其他函数中,NULL用于标记列表的末尾。

另一种选择是为参数数量添加一个额外的函数参数,但这会使代码变得更加脆弱,需要程序员管理一个额外的参数,而不是简单地使用NULL作为最后一个参数。

您还将看到(char *) 0用作标记:

代码语言:javascript
复制
execl("/bin/ls", "ls", "-l", (char *) 0);
票数 4
EN

Stack Overflow用户

发布于 2014-03-19 20:05:43

/usr/include/libio.h中,由于gcc 2.8 (很久以前) NULL被定义为null (是为内置保留),在此之前,NULL(void *)0,这与(char *)0varargs情况下无法区分,因为类型没有被传递,例外情况是如果定义了__cplusplus,在这种情况下,D9被定义为0。

安全的做法是显式地使用(void *)0,它被定义为与任何指针兼容,并且不依赖于标准库中可能出现的任何不可靠的#defines,尤其是如果您有64位架构的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12677120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档