【发布时间】:2020-11-20 12:32:05
【问题描述】:
我正在尝试使用 fopen 打开一个 .bdf 字体文件。这在 main() 中调用时工作正常,但是当我尝试在另一个文件中的函数中加载字体时,我收到一条 Permission Denied 消息,错误号为 13 来自 errno。
我正在使用 makefile 编译它并在树莓派上运行它:
./sudo clock
这是两个文件
main.cc
#include <stdio.h>
#include <errno.h>
#include "clock.h"
int main(int argc, char *argv[]) {
const char *path = "/home/pi/rpi-rgb-led-matrix/clock/fonts/6x12.bdf";
FILE *f = fopen(path, "r");
if (f == NULL) {
perror(path);
fprintf(stderr, "Failed load %d <-- Main\n", errno);
} else {
fprintf(stderr, "Font load succeeded <-- Main\n");
}
// Set up Clock Face
initialiseClockFace();
return 0;
}
时钟.h
#include <stdio.h>
#include <errno.h>
void initialiseClockFace();
时钟.cc
#include "clock.h"
void initialiseClockFace() {
const char *path = "/home/pi/rpi-rgb-led-matrix/clock/fonts/6x12.bdf";
FILE *f = fopen(path, "r");
if (f == NULL) {
perror(path);
fprintf(stderr, "Failed load %d <-- Clock\n", errno);
} else {
fprintf(stderr, "Font load succeeded <-- Clock\n");
}
}
运行时,它会打印以下内容:
Font load succeeded <-- Main
/home/pi/rpi-rgb-led-matrix/clock/fonts/6x12.bdf: Permission denied
Failed load 13 <-- Clock
看着https://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html, 除非我弄错了,错误号 13 是:
[EROFS]
The named file resides on a read-only file system and mode requires write access.
我尝试在 stackoverflow 和 Google 上搜索我的问题,但似乎找不到任何答案。非常感谢任何帮助。
【问题讨论】:
-
似乎第一个
fopen已锁定文件,因此第二个fopen失败。由于您没有使用任何一个文件句柄,因此很难确定建议什么作为替代方案。在调用initializeClockFace之前,您可以尝试使用fclose关闭main中的文件,或者您可以将文件句柄从main 传递给initializeClockFace,而不是再次尝试打开它。 -
你错了,错误 13 并不意味着该页面上列出的第 13 个错误。
errno不是这样工作的。您需要检查您的头文件以确定该页面上列出的错误名称中的哪些在您的上定义系统错误 13. -
假设您的 Raspberry 运行 Linux 变体,错误编号 13 很可能是
EACCES。perror消息“Permission denied”也暗示了这一点。
标签: c fopen permission-denied errno