簡體   English   中英

執行與執行

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM