有什么场合更适合使用execl而不是execlp?我认为当一个程序位于两个不同的文件夹中时,使用execlp可能会导致混乱,但我不知道这是否是唯一的情况。我问这个问题是因为人们可能会认为写作execlp("ls", ...)比写作更容易execl("/bin/ls", ...)。
通过查找程序PATH很方便,但也可能不安全。如果用户目录中的目录PATH是全局可写的,则有可能将恶意程序注入到PATH查找中。这会影响execlp但不会execl。
例如,如果您有一个PATH喜欢/foo/bar/bin:/home/you/bin:/usr/bin:/bin并且/foo/bar/bin是全局可写的,则有权访问该计算机的人可以将恶意程序复制到/foo/bar/bin/ls. 然后执行ls将运行/foo/bar/bin/ls而不是/bin/ls. 他们将能够像您一样执行命令并获得更大的访问权限。
因此,引用已知位置中的特定可执行文件通常是一个好主意。PATH或者在可执行文件中硬连线安全。
虽然 POSIX 指定了一组通用的 Unix 命令和功能,但许多程序都依赖于扩展。如果您的程序使用这些扩展,那么获取第一个扩展PATH可能不是一个好主意。
例如,在 OS X 上,安装的实用程序/bin是/usr/binBSD 风格的。但我之前在我的PATH. 例如,设计为在 OS X 上运行的程序需要显式使用,/bin/ls或者/usr/bin/tar确保它们获得这些实用程序的已知版本。
$ /usr/bin/tar --version
bsdtar 2.8.3 - libarchive 2.8.3
$ tar --version
tar (GNU tar) 1.29
Run Code Online (Sandbox Code Playgroud)