fopen和open之间的关系是什么?

5

我正在为一门课程的项目工作,我们得到了一个包含以下代码的 .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()

这将导致"permission denied"错误,从而破坏我的代码。

我想问的是fopen和open有什么关系?每个人似乎都能背诵open是系统调用,而fopen是标准库函数,但我似乎找不到一个清晰的答案,即如何使用fopen()创建一个可以通过open()打开而不会出现"permission denied"错误的文件,或者如何使用open()创建一个文件,然后可以使用open()写入、关闭并再次打开。

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

如果这有点混乱,对不起,我非常累。

PS:应该注意到,我正在编译和运行大学计算机上的程序,因此权限可能会很“奇怪”,但应该注意到,如果我使用终端命令“dd”创建文件,则open()将起作用,而且,我显然具有某些写入权限,因为我确实可以使用fopen和fprintf写入文件。


2
根据操作系统的不同,这些功能之间可能没有任何关系,除了打开文件。 - Some programmer dude
相关问题:https://dev59.com/UXI-5IYBdhLWcg3w0MHx - Klas Lindbäck
1个回答

5

fopen 是由标准 C 运行时提供的库函数,它返回一个流并且您可以调用流函数,例如 fscanf, fprintf, 或者 fread, fwrite

open 通常是在类 Unix 系统上的系统调用,由操作系统内核提供,它返回一个文件描述符,您可以使用该文件描述符调用 IO 函数,例如 read, write

通常情况下,fopen 使用 open 进行实现。

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


我还尝试了 FILE* file = fdopen(des,"w+"),但显然甚至无法写入文件。 - botch
1
在调用此函数之前,des 需要是 O_WRONLY 或 O_RDWR。 - fluter
据我所知,如果您使用 C,那么 open 也是一个库函数。 - red0ct
这完全取决于平台和实现方式,例如glibc为许多系统调用提供了包装器,否则您将调用类似syscall(SYS_OPEN, "file", mode)的内容。 - fluter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接