
Linux中open与fopen区别如下:
1、来源
从来源的角度看,两者能很好地区分开,这也是最显而易见的区别:
①open是Unix系统调用函数,返回的是文件描述符,它是文件在文件描述符表里的索引
②fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。
2、移植性
这一点从上面的来源可以推断出来,fopen是C标准函数,因此拥有良好的移植性,而open是Unix系统调用,移植性有限。如Windows下相似的功能使用API函数CreateFile。
3、适用范围
①open返回文件描述符,而文件描述符是Unix系统下的一个重要概念,Unix下的一切设备都是以文件的形式 *** 作。如网络套接字、硬件设备等。当然包括 *** 作普通正规文件。
②fopen是用来 *** 纵普通正规文件。
4、文件IO层次
如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。
open系统调用open函数的三个参数:
(1)path是已经存在的文件的路径;
(2)oflags参数:若值为 O_RDONLY ,就以只读方式打开文件;
若值为 O_WDONLY,就以只写方式打开文件;
若值为 O_RDWR,就以读写方式打开文件;
(3)参数mode:文件的权限,对于一个已经存在的文件,参数mode是没有用的,通常将其省略,因此这种情况下open调用只需两个参数。
创建新文件:
前面已经说到,当文件不存在时,open会创建一个新文件(仅能是普通文件),我们只需要用 or *** 作向open的 oflags参数中加入标志O_CREAT即可。这样可以创建一个新的只读文件,但是这没有任何意义,因为所创建的新文件没有任何可读内容。因此一般需要 O_CREAT与 O_WRONLY或 O_RDWR一起使用,此时就需要mode参数了。
例如:
int fd = open("/home/LY/newfile",O_RDWR | O_CREAT,MODE_FILE)
参数mode仅在创建新文件时有效,对于一个已经存在的文件,它没有任何作用。
关于open的flags参数:
除了以上介绍的 open标志外,open还有许多标志,具体的如下表所示:
标志
解释
O_RDONLY
只读方式打开
O_WRONLY
只写方式打开
O_RDWR
读写方式打开
O_APPEND
每次写都追加到文件的尾端
O_CREAT
若文件不存在则创建文件
O_DSYNC
设置同步I/O方式
O_EXCL
如果文件已存在,则出错;必须与O_CREAT一起使用
O_NOCTTY
不将此设备作为控制终端
O_NONBLOCK
不等待命名管道或特殊文件准备好
O_RSYNC
设置同步I/O方式
O_SYNC
设置同步I/O方式
O_TRUNC
将其长度截短为0
write系统调用
write函数的三个参数:
(1)fildes: 文件描述符
(2)buf:指定写入数据的数据缓冲区
(3)nbytes:指定写入的字节数
函数返回值:
成功:已写的字节数
-1 :出错
0:未写入任何数据
例子:
运行结果:
read系统调用
read函数的三个参数:
(1)fildes:文件描述符
(2)buf:指定读入数据的数据缓冲区
(3)nbytes:指定读入的字节数
函数返回值:
成功:已读的字节数
0:未读入任何数据
-1:出错
例子:
运行结果:
close系统调用
通过对 close进行分析,我们会发现close并没有做什么实质工作,它没有刷新任何内核缓冲区,而仅仅是使文件描述符可以重用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)