Ubuntu系统Unix环境下调用open函数读写文件报Permission denied错误如何解决?
报错原因
- 工作目录权限不足:Linux系统中要在某个目录下创建、修改文件,当前运行程序的用户必须同时拥有该目录的写权限(w)和执行权限(x)。如果程序是在/root、/sys、/proc这类系统专属目录,或者所属用户为其他用户的受限目录下运行,就会触发权限拒绝。
- 同名文件已存在且无访问权限:如果运行路径下已经存在名为
newfile.txt的文件,该文件的所有者不是当前用户,且未给当前用户开放读写权限,哪怕你代码中加了O_CREAT、O_TRUNC标记也无法修改已有文件的访问权限,依旧会报错。 - 安全模块限制:Ubuntu默认开启的AppArmor,或者手动配置的SELinux规则如果限制了程序的文件访问权限,也会触发该报错。
- 文件路径配置错误:如果代码中实际写的是带前缀的绝对路径,指向了无权限访问的目录,也会出现权限错误。
解决方法
- 先验证目录权限:在程序运行的目录下手动执行
touch test.txt && echo 1 > test.txt,如果手动操作也报错,说明是目录权限问题。执行ls -ld .查看当前目录的权限配置,要么把程序移动到当前用户的家目录(~/)下运行,要么执行sudo chmod u+wx 当前目录路径给当前用户开放目录的写和执行权限。 - 清理同名文件:执行
ls -l newfile.txt检查是否已有同名文件,存在的话可以执行sudo rm -f newfile.txt删除后再运行程序,或者执行sudo chown 当前用户名 newfile.txt && sudo chmod u+rw newfile.txt给当前用户开放文件的读写权限。 - 排查安全规则:可以临时关闭AppArmor对应程序的规则测试,确认是否是安全模块拦截了文件访问请求。
- 代码优化:把
perror("fd error\n");中的换行符去掉,perror本身会自动拼接系统错误描述,去掉换行后能看到更精准的错误提示。
内容的提问来源于stack exchange,提问作者lst
相关产品推荐
相关产品推荐

