转自http://blog.chinaunix.net/uid-29025972-id-3847404.html
1.层次不同
- open是系统调用,返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引。
- fopen是ANSIC标准中的C语言库函数,返回的是一个指向文件结构的指针。在不同的系统中应该调用不同的内核api,Linux中的内核api是open。fopen是open的封装函数,fopen的实现要调用open。
2.缓存不同
fopen和open另一个区别是是否有缓存
- fopen用户态下就有了缓存,它使用了FILE这个结构保存缓冲数据。在进行read和write的时候减少了用户态和内核态的切换。
- open没有缓存,每次读操作都直接从文件系统中获取数据。在进行read和write的时候每次都需要进行内核态和用户态的切换。
表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列快;如果随机访问文件open要比fopen快。
3.一般用fopen打开普通文件,用open打开设备文件。