[英]Execlp vs Execl
有什么情况下最好使用execl
而不是execlp
吗? 我认为,当程序位于两个不同的文件夹中时,使用execlp
可能会引起混乱,但我不知道这是否是唯一的情况。 我问,是因为有人认为写execlp("ls", ...)
比写execl("/bin/ls", ...)
容易。
通过PATH
查找程序很方便,但是它也不安全。 如果用户PATH
的目录是可写的,则有可能将恶意程序注入PATH
查找中。 这将影响execlp
但不会影响execl
。
例如,如果您具有/foo/bar/bin:/home/you/bin:/usr/bin:/bin
这样的PATH
并且/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
早期安装了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
如果您的可执行文件位于不同的文件夹或相同的文件夹中,则execl()
和execlp()
可以正常工作,但如果不同的文件夹,则需要设置$ PATH。
execl()
是从命令行执行可执行文件(如“ ls” execl()
所必需的,因为在这种情况下,您不能使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.