fopen和open有什么关系?

What is the relation between fopen and open?

我正在为 class 开发一个项目,我们得到了一个包含以下代码的 .c 文件:

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

所以我知道它试图用 read/write 权限打开文件 "my_dev",然后在成功时返回文件描述符或在失败时返回负值,但我不明白这就是为什么它一直给我 "permission denied"。我尝试使用此代码:

int des = open("my_dev", O_CREAT | O_RDWR, 0777);
...
close(des)

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

FILE* file = fopen("my_dev","w+");
fprintf(file,str);
fclose(file);

我可以写入文件,这意味着我有写权限。现在通常情况下,我只会对所有内容使用 fopen 和 fprintf,但是对于这个项目,我们不得不使用老师的 .c 文件,该文件将尝试使用

 open()

这将给出一个 "permission denied" 错误,这反过来会搞砸我的代码。

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

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

对不起,如果这有点零散,我太累了。

PS: 需要注意的是,我是在大学电脑上编译和运行,所以权限可能是"weird" 但是需要注意的是,如果我创建文件使用终端命令 "dd" open() 将起作用,此外,我显然有一些写权限,因为我确实可以使用 fopen 和 fprintf

写入文件

fopen是标准C运行时提供的库函数,它returns一个流,你可以在上面调用流函数,比如fscanffprintf, 或 fread, fwrite.

open通常是类unix系统上的系统调用,由操作系统内核提供,它returns是一个文件描述符,可以通过fd调用IO函数,如read, write.

一般fopen使用open下划线实现。

如果你想在文件描述符上使用标准流函数,你可以使用 posix api、fdopen,它接受一个 fd,和 returns FILE* 流。