c++怎么检查当前进程是否具有文件的可执行权限_permissions位运算【详解】

夏枫酱_2775

夏枫酱_2775

2026-04-07

620人浏览

原创

access(path, x_ok) 返回0表示有执行权限,它基于真实uid/gid、acl及noexec等挂载选项判断“能否执行”,比stat()+st_mode位运算更准确可靠。

c++怎么检查当前进程是否具有文件的可执行权限_permissions位运算【详解】

怎么用 access() 检查可执行权限(最常用且可靠)

直接调用 access() 是检查当前进程对文件是否具有可执行权限的首选方式,它考虑了真实用户/组身份、ACL 和挂载选项(如 noexec),比单纯读取 stat() 的 st_mode 更准确。

关键点:

  • access(path, X_OK) 返回 0 表示有执行权限;返回 -1 且 errno == EACCES 表示无权;errno == ENOENT 表示文件不存在
  • 它检查的是「能否执行」,不是「文件是否是可执行文件」——比如一个普通文本文件,只要权限位允许 +x 且未挂载为 noexec,access(..., X_OK) 也可能返回成功
  • 注意:在 setuid/setgid 程序中,access() 使用**实际用户 ID(real UID)** 判断,而非有效 UID,这是它和手动位运算的关键安全差异

为什么不能只靠 stat() + st_mode 位运算判断

很多人会读取 struct stat 后用位运算检查 st_mode & S_IXUSR 等,但这只是检查文件权限位,忽略了很多运行时约束:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 挂载选项:文件系统以 noexec 挂载时,即使 S_IXUSR 被置位,也无法执行
  • SELinux/AppArmor 等 MAC 策略可能拒绝执行,但 stat() 完全不体现
  • 目录的可执行权限(X_OK)实际表示「可进入」,而 S_IXUSR 在目录上也对应此语义——但新手常误以为它只用于二进制文件
  • 如果进程的有效 UID/GID 与文件所有者不匹配,需同时检查 S_IXGRP 和 S_IXOTH,逻辑易错;而 access() 自动按进程实际身份做完整判定

st_mode 中执行位对应的宏和常见误用

若你确实需要解析 st_mode(例如做权限快照、日志审计),必须用标准宏,而不是硬写数字或移位:

  • 用户执行位:S_IXUSR(不是 0100 或 1 —— 虽然值相同,但可移植性差)
  • 组执行位:S_IXGRP
  • 其他用户执行位:S_IXOTH
  • 检查是否任意执行位开启:(st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0
  • 注意:S_ISREG(st.st_mode) 必须先确认是常规文件,否则对目录或设备文件谈「可执行」容易误导——目录的 X 是「可遍历」,不是「可运行」

Linux 下 access() 的实际行为细节

access() 在 Linux 上的行为比 POSIX 更精细,但仍有边界情况需留意:

  • 对符号链接:默认检查**目标文件**的权限(不跟随链接的权限位),符合直觉
  • 对目录:检查是否能 chdir() 进入(即 X_OK 语义),不是检查能否「运行目录」
  • 性能:一次系统调用,开销远小于 fork+exec 失败再捕获错误
  • 线程安全:access() 是异步信号安全的,可在信号处理函数中谨慎使用(但一般没必要)
  • 替代方案?open(..., O_PATH | O_EXEC)(Linux 3.19+)可更早失败,但兼容性差,且仍不如 access() 通用

真正容易被忽略的是:即使 access(path, X_OK) == 0,后续 execve() 仍可能失败——比如文件被删(unlink() 后句柄仍有效)、格式不支持(非 ELF/脚本无解释器)、或磁盘 I/O 错误。权限检查只是必要非充分条件。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2567

5

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2023.10.16

2853

3

asp连接access数据库的方法
asp连接access数据库的方法

连接的方法:1、使用ADO连接数据库;2、使用DSN连接数据库;3、使用连接字符串连接数据库。想了解更详细的asp连接access数据库的方法,可以阅读本专题下面的文章。

2023.10.18

2573

4

access和trunk端口的区别
access和trunk端口的区别

access和trunk端口的区别是Access端口用于连接终端设备,提供单个VLAN的接入,而Trunk端口用于连接交换机之间,提供多个VLAN的传输;Access端口只传输属于指定VLAN的数据,而Trunk端口可以传输多个VLAN的数据,并使用VLAN标签进行区分。想了解更多access和trunk端口相关内容,可以阅读本专题下面的文章。

2023.10.31

448

3

access怎么导入数据
access怎么导入数据

access导入数据步骤:1. 选择数据源 2. 选择要导入的文件 3. 指定导入选项 4. 选择导入目标 5. 预览数据 6. 导入数据即可。想了解更多access的相关内容,可以阅读本专题下面的文章。

2024.04.10

4545

10

access数据库用途
access数据库用途

access数据库是一种关系型数据库管理系统,主要用途包括:数据存储和管理;数据查询和检索;报告和表单设计;应用程序开发。想了解更多access数据库的相关内容,可以阅读本专题下面的文章。

2024.04.10

9748

16

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

2026.10.10

100

15

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

2026.10.10

40

15

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

2026.10.10

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习