[英]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.