You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用mkdir()后使用ofstream::operator<<会出现权限拒绝错误?

排查 errno 13(权限拒绝)问题

让我一步步帮你梳理并排查这个权限拒绝的问题!先把你给出的前置操作和信息整理清楚:

已执行的前置操作

whoami
usera
cd ~
mkdir abc
ls -ld abc
drwxrwxr-x 2 usera usera 4096 May 2 16:36 abc
cd abc

你的代码片段(main.cpp,位于abc目录下)

//main.cpp
#include <iostream>
#include <string>
#include <fstream>
#include <cerrno>
#include <cstdio...

接下来,结合你的场景,我列出几个常见的导致权限拒绝的原因,你可以逐一排查:

1. 代码中操作的文件路径是否存在问题?

你用fstream操作文件时,有没有可能指定了当前目录以外的受限路径?比如尝试写入/etc、/root这类普通用户无权限的目录,或者拼写错误导致路径指向了不属于你的文件/目录。如果是操作当前目录下的文件,也可以检查下文件名是不是包含特殊字符,或者不小心用了绝对路径。

2. 目标文件本身的权限(如果操作已存在的文件)

如果你的代码是读写一个已经存在的文件,哪怕它在abc目录下,也可能因为文件本身的权限设置导致无法操作。比如文件是其他用户创建的,权限是rw-------,那usera就没法读写。可以用ls -l 目标文件名查看具体权限。

3. 父目录的权限链是否完整?

虽然abc目录的权限是drwxrwxr-x,但要确保从根目录到abc的所有父目录都有执行权限(x)——对目录来说,执行权限代表允许进入该目录。你可以用这条命令查看整个路径的权限链:

namei -l ~/abc

每个层级的目录都需要保证usera(或所属组、其他用户)有x权限。

4. 系统安全模块的限制

有些Linux发行版会启用SELinux或AppArmor这类强制访问控制模块,哪怕文件系统权限没问题,它们也会阻止程序读写文件。你可以临时关闭SELinux测试(仅限排查,不要长期关闭):

sudo setenforce 0

如果关闭后程序正常运行,那就是SELinux策略的问题,需要调整对应规则。

5. 文件打开模式是否错误?

比如你用fstream打开文件时指定了写入模式,但目标文件是只读的;或者尝试创建文件,但abc目录虽然有写权限,却因为挂载为只读等原因无法创建。建议在代码里补充错误打印,精准定位问题:

#include <cstring>
// ...
std::fstream file("test.txt", std::ios::out);
if (!file.is_open()) {
    perror("Failed to open file");
    std::cout << "Detailed error: " << strerror(errno) << std::endl;
}

6. 程序是否以其他用户身份运行?

比如你不小心用sudo启动了程序,或者通过某种方式切换了运行用户,导致程序的执行身份不是usera,那访问abc目录下的文件自然会有权限问题。可以在代码里加入这段代码确认当前运行用户:

#include <unistd.h>
// ...
std::cout << "Current UID: " << getuid() << ", GID: " << getgid() << std::endl;

你可以先补充完整代码里的文件操作逻辑,或者先尝试上面的排查步骤,应该能定位到问题所在!

内容的提问来源于stack exchange,提问作者StoneThrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:32:46