主要观点:通过调用chmod(2)设置文件权限(文件模式),chmod(1)命令行有多种设置权限的方式,但底层系统调用需要int,C 头文件使用起来较麻烦,于是用 C++机制使其更易用。
关键信息:
chmod的 C 接口需路径名和模式,有符号常量如S_IRUSR等。- 常以八进制思考文件模式,如“755 用于可执行文件”等,但 C 源中八进制形式较繁琐。
ls -l输出的文件权限用 10 个字符表示,前 9 个字符分别表示当前用户、组、其他用户的读、写、执行权限。- 编写 C++函数将文本形式的 9 字符模式转换为
mode_t值,还可写成consteval函数在编译时计算,进而将其变成用户定义字面量,如chmod("example.txt", "rw-r--r--"_mode)。 - 在 Qt 中,
QFileDevice::Permission的值是十六进制但看起来像八进制,导致更易混淆。 - 通过模板和类型命名可改善现有错误消息,如在 C++中使用合适的模板函数可明确指出错误位置和字符。
重要细节:
- 定义用户定义字面量
_mode的函数,检查字符串长度是否为 9,否则抛出异常。 - 实现将字符串转换为
mode_t的函数,通过多个expected_character_at_position模板函数检查每个位置的字符是否符合要求,不符合则抛出异常。 - 不同编译器(如 Clang 17、GCC 13)的错误消息形式类似,都能指出错误位置和字符。
- 代码可在个人 GitHub 仓库的
playground子目录mode/中找到。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。