有什么场合可以更好地使用execl
而不是execlp
?我认为当一个程序位于两个不同的文件夹中时,execlp
可能会导致混淆,但我不知道这是否是唯一的情况。我问是因为人们可能认为写作execlp("ls", ...)
比写作更容易execl("/bin/ls", ...)
。
2 回答
安全
通过查找程序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/bin
BSD 风格的。但我的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
如果您的可执行文件位于不同的文件夹或相同的文件夹中,两者都execl()
可以正常工作,但如果文件夹不同,则需要设置 $PATH。execlp()
execl()
从命令行执行可执行文件(如“ls”)是必需的,因为在这种情况下您无法使用execlp()
。我在下面添加了一个快照。
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
if(argc!=2)
{
printf("Usage Msg: ./a.out userdefined_executable \n");
return;
}
//execl(argv[1],argv[1],NULL);//**it works**
execlp(argv[1],argv[1],NULL);//**it doesn't work**
return 0;
}
//Input will be like this, here "p1" is an user-defined executable.
//xyz@xyz:~/stack_overflow$ ./a.out p1