最近,同课题组的师弟在学习 C++ 时遇到了一个奇怪的问题,使用open
和write
系统调用后,程序的输出是正常的,但是无法正常显示文件的内容。出现问题的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| int main() {
int fd = ::open("111.txt",O_CREAT | O_WRONLY);
if(fd < 0){ std::cerr << errno; return 1; }
std::string str(1<< 10,'1');
size_t wr = ::write(fd,str.c_str(),str.size());
std::cout << "total write bytes: " <<wr << std::endl;
close(fd); return 0; }
total write bytes: 1024
|
但是,在 CLion 中打开目标文件,却不能显示任何内容:
最初学弟以为是文件内容没有成功写入,在网上寻找答案未果。经过排查后,发现问题出现在文件的权限上,而非程序写入失败。在终端使用 ls 和 cat 命令可以验证这一猜想:
1 2 3 4 5 6 7 8 9 10
| # 使用 ls 发现文件大小是 1024,证明写入成功,但权限非常奇怪 ls -l 111.txt --w-r-x--- 1 tangrenchu staff 1024 Jan 26 19:58 111.txt
# 使用 cat 命令 cat 111.txt zsh: permission denied: ./111.txt
sudo cat 111.txt 111111111111111111111111111...
|
这段代码的编译和运行环境为 MacOS,可能由于 MacOS 的权限分组比较奇怪,导致代码所在的用户组与登录用户不同,导致登录用户没有权限读取文件内容。