我正在为一个类做一个项目,我们得到了一个包含以下代码的.c文件:
int fd = -1;
if (fd < 0)
{
fd = open ("my_dev", O_RDWR);
if (fd < 0)
{
perror ("open");
return -1;
}
...
所以我知道它正在尝试使用读/写权限打开一个文件"my_dev",然后在成功时返回文件描述符或在失败时返回负值,但我不明白的是为什么它始终给我"权限被拒绝"。我尝试使用此代码:
int des = open("my_dev", O_CREAT | O_RDWR, 0777);
...
close(des)
打开/创建文件(这在另一个块之前调用),但这不起作用,但是如果我只是使用它:
FILE* file = fopen("my_dev","w+");
fprintf(file,str);
fclose(file);
我可以写入文件,这意味着我具有写入权限。现在通常,我只会使用 fopen 和 fprintf 来处理所有事情,但对于这个项目,我们不得不使用老师的 .c 文件,该文件将尝试使用
open()
这将给出"权限被拒绝"错误,这反过来又会搞砸我的代码。
我想我的问题是开放和开放如何相互关系?每个人似乎都能背诵 open 是一个系统调用,而 fopen 是一个标准的 lib 函数,但我似乎找不到一个明确的答案,说明如何使用 fopen() 创建一个可以通过 open() 打开的文件而不会出现"权限被拒绝"错误,或者我如何使用 open() 创建一个文件,然后我可以写入该文件, 关闭并使用 open() 再次打开。
简而言之,如何在 C 中创建一个可以写入并在以后使用 open(O_RDWR) 打开的文件?
对不起,如果这有点零碎,我超级累。
PS:应该注意的是,我正在大学计算机上编译和运行,因此权限可能"奇怪",但应该注意的是,如果我使用终端命令"dd"创建文件,open()将起作用,此外,我显然有一些写入权限,因为我确实可以使用fopen和fprintf写入文件
fopen
是一个由标准 C 运行时提供的库函数,它返回一个流,你可以在它上面调用流函数,如 fscanf
、 fprintf
或 fread
、 fwrite
。
open
通常是对类Unix系统上的系统调用,由操作系统内核提供,它返回一个文件描述符,可以用fd调用IO函数,比如read
、write
。
通常fopen
是使用open
下划线实现的。
如果要在文件描述符上使用标准流函数,可以使用 posix api、fdopen
,它采用 fd 并返回FILE*
流。