Execlp 与 Execl

Execlp vs Execl

在什么情况下使用 execlexeclp 更好? 我认为当一个程序位于两个不同的文件夹中时,使用 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

兼容性

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

如果您的可执行文件位于不同的文件夹或同一文件夹中,execl()execlp() 都可以正常工作并且类似,但如果不同的文件夹,则需要设置 $PATH。

命令行 执行可执行文件(如 "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