0%

write系统调用失效?——MacOS权限设置问题

最近,同课题组的师弟在学习 C++ 时遇到了一个奇怪的问题,使用openwrite系统调用后,程序的输出是正常的,但是无法正常显示文件的内容。出现问题的代码如下:

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 中打开目标文件,却不能显示任何内容:

image-20230126195448049

最初学弟以为是文件内容没有成功写入,在网上寻找答案未果。经过排查后,发现问题出现在文件的权限上,而非程序写入失败。在终端使用 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 的权限分组比较奇怪,导致代码所在的用户组与登录用户不同,导致登录用户没有权限读取文件内容。