Ubuntu中的execl()参数

use*_*102 7 c c++ linux ubuntu exec

我正在学习linux编程并且遇到了exec函数,它非常有用.但问题是exec函数参数非常混乱,我无法掌握哪个参数是出于什么目的.在下面的代码execl()函数中,通过创建fork()的子函数调用,最后一个参数(NULL)的目的是什么execl()

execl("/bin/ls","ls","-l",NULL);
Run Code Online (Sandbox Code Playgroud)

如果有人可以解释NULL论证和其他论点的目的是什么,以及exec()家庭功能论证的目的,那对我来说将是一个很大的帮助!

Jam*_*nze 14

创建未定义的行为.这不是法律要求execl.正确的电话可能是:

execl( "/bin/ls", "ls", "-l", (char*)0 );
Run Code Online (Sandbox Code Playgroud)

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

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

  • @NominalAnimal为了完全清楚,当在需要指针类型的上下文中使用`NULL`(或`0`)时,它被隐式转换为空指针.然而,将参数传递给```确实_not_需要指针类型,并且不会发生转换; 你传递'0`.G ++使用编译器魔法来表示"NULL",所以你可能会用g ++来解决它,但是我使用了不止一些编译器,它不起作用; 其中`char*`大于`int`(并且`NULL`被定义为'0`). (3认同)
  • 您到底为什么认为使用“NULL”而不是“(char*)0”会产生未定义的行为? (2认同)
  • @JanSpurny因为Posix标准这样说.更一般地说,如果varargs函数试图提取除传递类型之外的类型,则C标准表示它是未定义的行为.`execl`被记录为需要`char*`.在提取参数之前,它很难尝试另一种类型.`NULL`有一个整数类型,通常是`int`.所以传递`NULL`是未定义的行为,并且自从指针停止注入以来一直如此. (2认同)
  • @JamesKanze:彻底废话.POSIX声明`NULL`,作为空指针,*零转换为指针*[POSIX定义,3.244],通常是`(void*)0`.它**是**(void*)0`或等效表达式.在C89和C99中,`void*`不需要转换为任何其他指针类型.因此 - 这包括我曾经使用的**ALL**C89/C99/GNU C实现,从微控制器到计算集群 - "NULL"是用于此的正确实现,以及所有其他类似的可变参数函数. (2认同)