Execlp vs Execl

时间:2017-11-09 03:15:23

标签: c execl

是否有更好的机会使用execl代替execlp? 我想也许当一个程序在两个不同的文件夹中使用execlp时可能会导致混淆,但我不知道它是否是唯一的情况。 我问,因为有人认为写execlp("ls", ...)比写execl("/bin/ls", ...)更容易。

2 个答案:

答案 0 :(得分:1)

安全

通过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

兼容性

While there is a common set of Unix commands and features specified by POSIX,许多程序都依赖于扩展。如果您的程序使用这些扩展程序,那么抓住PATH中的第一个扩展程序可能不是一个好主意。

例如,在OS X上,/bin/usr/bin中安装的实用程序是BSD风格的。但我之前在PATH安装了GNU版本。设计为在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

答案 1 :(得分:0)

如果您的可执行文件位于不同的文件夹或同一文件夹中,../hero { background: url('../../img/hero-bg.jpg') repeat; } 都可以正常工作,但是如果不同的文件夹需要设置$ PATH。

命令行执行可执行文件(如“ls”)需要

execl(),因为在这种情况下您无法使用execlp()。我在下面添加了一个快照。

execl()