权限
- r 可读权限 4(8进制)
- w 可写权限 2(8进制)
- x 可执行权限 1(8进制)
创建文件夹
- 这里以777权限创建了一个文件夹
- 就是上面的读写可执行权限都有
1 2 3 4 5 6 7 |
struct stat buff; auto cache_path = ues_path.append("/cache_c").c_str(); if (stat(cache_path, &buff) != 0) { mode_t mode = 0777; ::mkdir(cache_path, mode); } return cache_path; |
文件相关
函数
1 |
FILE *fopen(const char *path, const char * mode); |
mode
- “r” :以只读方式打开文件,该文件必须存在。
- “w” :打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
- “a” :以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
- “r+” :以可读写方式打开文件,该文件必须存在。
- “w+” :打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
- “a+”:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
- “rb” :只读打开一个二进制文件,只允许读数据。
- “wb” :只写打开或建立一个二进制文件,只允许写数据。
- “ab” :追加打开一个二进制文件,并在文件末尾写数据。
- “rb+” :读写打开一个二进制文件,允许读写数据,文件必须存在。
- “wb+” :读写打开或建立一个二进制文件,允许读和写。
- “ab+” :读写打开一个二进制文件,允许读,或在文件末追加数据。
- “rt” :只读打开一个文本文件,只允许读数据。
- “wt” :只写打开或建立一个文本文件,只允许写数据。
- “at” :追加打开一个文本文件,并在文件末尾写数据。
- “rt+” :读写打开一个文本文件,允许读和写。
- “wt+” :读写打开或建立一个文本文件,允许读写。
- “at+” :读写打开一个文本文件,允许读,或在文件末追加数据。
掩码问题
- umask是一个四位八进制,用以控制新创建的文件或目录的权限
- 默认的umask值这里显示的是0022
1 2 |
enlink@enlinkdeMacBook-Pro cmake-build-debug % umask 022 |
- 也就是说,我们用上面代码创建的文件夹的实际权限,其实是0755(对其他用户来讲,可读可执行但不可写)
- 需要额外注意的是,umask的值是特定于进程的,即一个进程的umask的值不会影响到另一个进程的umask值
- 所以,可以在修改完umask值后不用将其恢复
code
- 这里通过修改umask值创建了一个0777权限的文件夹
1 2 3 4 5 6 7 8 9 |
struct stat buff; auto cache_path = ues_path.append("/cache_c").c_str(); if (stat(cache_path, &buff) != 0) { auto temp_mask = umask(0000); mode_t mode = 0777; ::mkdir(cache_path, mode); umask(temp_mask); } return cache_path; |
记录下为什么要创建一个这样的0777的文件夹
- 背景:
- 在Clion里面以root权限启动了测试程序,加载了一个动态库
- 这个动态库里面有一个地方会在某个特点文件夹没有的时候创建它,紧接着在文件夹里面创建文件
- 现象:
- 以root启动测试程序后,创建的文件夹属于系统,在没有更改umask之前,想创建的文件夹权限是0755
- 创建后,文件夹简介显示自定,没有写权限
- 于是以0766权限创建文件夹,创建后,发现显示可读
- 总结:
- 因为umask的作用,以0755的掩码创建的文件是没有写权限的,所以导致会在这个文件夹里新建文件失败
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ COM组件_303/07
- ♥ Zlib记述:一09/17
- ♥ Windbg:命令实践详解一03/27
- ♥ CMake教程二07/07
- ♥ 2019_11_0511/07
- ♥ 51CTO:C++网络通信引擎架构与实现一09/09