【问题标题】:What is the relation between fopen and open?fopen和open有什么关系?
【发布时间】:2016-04-25 06:39:04
【问题描述】:

我正在为一个班级做一个项目,我们得到了一个包含以下代码的 .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()

这将给出一个“权限被拒绝”错误,这反过来又会搞砸我的代码。

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

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

对不起,如果这有点片断,我超级累。

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

【问题讨论】:

标签: c permissions fopen file-descriptor read-write


【解决方案1】:

fopen是标准C运行时提供的库函数,它返回一个流,你可以在其上调用流函数,如fscanffprintffreadfwrite

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

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

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

【讨论】:

  • 我还尝试了 FILE* file = fdopen(des,"w+") ,显然它甚至无法写入文件。
  • des 需要在 O_WRONLY 或 O_RDWR 中才能调用。
  • AFAIK 如果你使用C open 也是一个库函数。
  • 这一切都取决于平台和实现,例如,glibc 为许多系统调用提供了包装器,否则你会调用类似 syscall(SYS_OPEN, "file", mode)
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 2010-10-07
  • 2011-01-01
  • 1970-01-01
  • 2017-12-01
  • 2011-04-06
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多