侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

fexecve函数用法详解

noerror
2022-10-04 / 0 评论 / 0 点赞 / 160 阅读 / 720 字 / 正在检测是否收录...

fexecve函数用法详解

fexecve函数简介

  • 头文件包含
#include <unistd.h>
  • 函数定义
int fexecve(int  fd , char *const  argv [], char *const  envp []);

fexecve函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘fexecve’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <unistd.h>

fexecve函数详细描述

fexecve ()执行与execve (2)相同的任务,不同之处在于要执行的文件是通过文件描述符fd 而不是通过路径名指定的。文件描述符fd必须以( O_RDONLY )或 O_PATH 标志打开,并且调用方必须具有执行它所引用的文件的权限。

fexecve函数返回值

成功调用fexecve ()永远不会返回。错误时,函数返回,结果值为-1,并适当设置errno。

fexecve函数错误码

execve (2)的错误如下:

  • EINVAL fd不是有效的文件描述符,或者argv为空,或者envp为空。
  • ENOENT 在fd 上设置执行时关闭标志,fd引用脚本。看到虫子。
  • 内核不提供execveat (2)系统调用,并且无法访问/proc文件系统。

fexecve函数其他说明

在带有glibc2.26及更早版本的Linux上,fexecve ()是使用proc (5)文件系统实现的,因此需要在调用时挂载并使用/proc。由于glibc2.27,如果底层内核支持execveat (2)系统调用,则使用该系统调用实现fexecve (),其好处是不需要挂载/proc。
fexecve ()背后的思想是允许调用方在执行可执行文件之前验证(校验和)该文件的内容。仅仅打开文件,对内容进行校验和,然后执行execve (2)是不够的,因为在这两个步骤之间,可以交换文件名或路径名的目录前缀(例如,通过修改符号链接的目标)。fexecve ()不能缓解在校验和和调用fexecve ();之间文件的contents可能被更改的问题。解决方案是确保对文件的权限防止恶意用户修改该文件。
使用fexecve ()时的自然习惯用法是在fd 上设置close-on-exec标志,这样文件描述符就不会泄漏到正在执行的程序中。这种方法很自然,有两个原因。首先,它防止不必要地使用文件描述符。(执行的程序通常不需要引用程序本身的文件描述符。)其次,如果递归地使用fexecve (),使用close-on-exec标志可以防止文件描述符耗尽,这是由于递归中的每一步都将导致多一个文件描述符传递给新程序。(但请参阅bugs。)

0

评论区