C语言 fopen 和 open 之间的关系是什么



我正在为一个类做一个项目,我们得到了一个包含以下代码的.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 运行时提供的库函数,它返回一个流,你可以在它上面调用流函数,如 fscanffprintffreadfwrite

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

通常fopen是使用open下划线实现的。

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

相关内容

  • 没有找到相关文章

最新更新