fopen和open之间有什么关系?

bot*_*tch 5 c permissions fopen file-descriptor read-write

我正在为一个类的项目工作,我们得到一个包含以下代码的.c文件:

int fd = -1;
if (fd < 0)
{
  fd = open ("my_dev", O_RDWR);
  if (fd < 0)
  {
    perror ("open");
    return -1;
  }
...
Run Code Online (Sandbox Code Playgroud)

所以我理解它正在尝试打开一个具有读/写权限的文件"my_dev",然后在成功时返回文件描述符或者在失败时返回负值,但我不明白为什么它给了我"权限被拒绝"始终如一.我试着使用这段代码:

int des = open("my_dev", O_CREAT | O_RDWR, 0777);
...
close(des)
Run Code Online (Sandbox Code Playgroud)

打开/创建文件(这是在另一个块之前调用),但这不起作用,但如果我只是使用它:

FILE* file = fopen("my_dev","w+");
fprintf(file,str);
fclose(file);
Run Code Online (Sandbox Code Playgroud)

我可以写入文件,这意味着我有写权限.现在通常情况下,我只会使用fopen和fprintf来处理所有事情,但对于这个项目,我们必须使用教师的.c文件,它将尝试使用

 open()
Run Code Online (Sandbox Code Playgroud)

这将导致"权限被拒绝"错误,这反过来会搞砸我的代码.

我想我的问题是fopen和open是如何相互关联的?每个人似乎都能够背诵open是一个系统调用,而fopen是一个标准的lib函数,但我似乎无法找到一个明确的答案,我可以用fopen()创建一个可以通过open()打开的文件一个"权限被拒绝"的错误,或者我如何创建一个open()文件然后我可以写入,关闭并再次打开open().

简而言之,如何在C中创建一个我可以写入的文件,稍后用open(O_RDWR)打开?

对不起,如果这是一个小小的,我非常累.

PS:应该注意的是我正在大学计算机上编译和运行,因此权限可能是"怪异的"但是应该注意的是,如果我使用终端命令"dd"创建文件,open()将起作用,此外,我显然有一些写权限,因为我确实可以使用fopen和fprintf写入该文件

flu*_*ter 5

fopen是由标准的C运行时提供的库函数,它返回一个流,你可以调用它的流功能,如fscanf,fprintffread,fwrite.

open通常是对类Unix系统的系统调用,由操作系统内核提供,它返回一个文件描述符,你可以用fd调用IO函数,比如read,write.

通常fopen使用open下划线实现.

如果要在文件描述符上使用标准流函数,可以使用posix api fdopen,它接受fd并返回FILE*流.