首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Execlp对Execl

Execlp对Execl
EN

Stack Overflow用户
提问于 2017-11-09 03:15:22
回答 2查看 6.9K关注 0票数 1

在哪种情况下使用execl而不是execlp更好?我认为,当程序在两个不同的文件夹中使用execlp时,可能会导致混淆,但我不知道这是否是唯一的情况。我之所以这样问,是因为人们可能会认为编写execlp("ls", ...)比编写execl("/bin/ls", ...)容易。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-09 04:30:11

安全性

通过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上,/bin/usr/bin中安装的实用程序都是BSD风格的。但是我在前面的PATH中安装了GNU版本。设计用于在OS上运行的程序需要显式使用,例如,/bin/ls/usr/bin/tar,以确保它们获得这些实用程序的已知版本。

代码语言:javascript
复制
$ /usr/bin/tar --version
bsdtar 2.8.3 - libarchive 2.8.3
$ tar --version
tar (GNU tar) 1.29
票数 5
EN

Stack Overflow用户

发布于 2017-11-09 04:41:51

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

需要execl()命令行执行可执行文件(如ls),因为在这种情况下不能使用execlp()。我在下面添加了一个快照。

代码语言:javascript
复制
#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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47193293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档