fopen和open之间有什么关系?

时间:2016-04-25 06:39:04

标签: 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;
  }
...

所以我明白它正试图打开一个文件&#34; my_dev&#34;具有读/写权限,然后在成功时返回文件描述符或在失败时返回负值,但我不明白为什么它给了我&#34;权限被拒绝&#34;一致。我试着使用这段代码:

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()

这将使&#34;许可被拒绝&#34;错误反过来会搞砸我的代码。

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

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

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

PS:应该注意的是,我正在大学计算机上进行编译和运行,因此权限可能很奇怪&#34;但是应该注意的是,如果我使用终端命令&#34; dd&#34;创建文件。 open()会工作,而且,我显然有一些写权限,因为我确实可以使用fopen和fprintf写入文件

1 个答案:

答案 0 :(得分:5)

fopen是由标准C运行时提供的库函数,它返回一个流,您可以在其上调用流函数,如fscanffprintf或{{1 },fread

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

通常使用read下划线来实现write

如果要在文件描述符上使用标准流函数,可以使用带有fd的posix api,fopen,并返回open流。