我正在学习linux编程,偶然发现了一个非常有用的exec函数。但问题是exec函数参数非常令人困惑,我无法掌握哪个参数是用于什么目的。在下面的代码中,从通过fork()创建的子级调用execl()函数,execl()中最后一个参数(NULL)的用途是什么
execl("/bin/ls","ls","-l",NULL);如果有人能解释NULL参数和其他参数的用途以及exec()族函数的参数的用途,那将对我有很大的帮助!
发布于 2012-10-02 00:25:47
创建未定义的行为。这不是对execl的合法调用。正确的调用可能是:
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,所以您不需要测试它。并且只有在出现某种错误时才会返回。)
发布于 2012-10-02 00:19:07
exec函数是可变的:它们接受数量可变的参数,以便您可以将数量可变的参数传递给命令。函数需要使用NULL作为标记来标记参数列表的末尾。
在可变函数中有一个循环,它将遍历可变数量的参数。这些循环需要一个终止条件。在某些情况下,例如printf,可以从另一个参数中推断出实际的参数数量。在其他函数中,NULL用于标记列表的末尾。
另一种选择是为参数数量添加一个额外的函数参数,但这会使代码变得更加脆弱,需要程序员管理一个额外的参数,而不是简单地使用NULL作为最后一个参数。
您还将看到(char *) 0用作标记:
execl("/bin/ls", "ls", "-l", (char *) 0);发布于 2014-03-19 20:05:43
在/usr/include/libio.h中,由于gcc 2.8 (很久以前) NULL被定义为null (是为内置保留),在此之前,NULL是(void *)0,这与(char *)0在varargs情况下无法区分,因为类型没有被传递,例外情况是如果定义了__cplusplus,在这种情况下,D9被定义为0。
安全的做法是显式地使用(void *)0,它被定义为与任何指针兼容,并且不依赖于标准库中可能出现的任何不可靠的#defines,尤其是如果您有64位架构的话。
https://stackoverflow.com/questions/12677120
复制相似问题