fread返回的是一个FILE结构指针,而read返回的是一个int的文件号。

        read是UNIX系统中的系统调用,是类UNIX系统,提供给程序员操作文件的接口。

        fread是C语言提供的读取文件的函数库。实际上底层也是靠调用的read来实现。

        包括open,read, write, seek,close,和fopen,fread,fwrite,fseek,fclose。他们分别表示无缓冲读写和有缓冲读写。read发生在内核空间,而fread发生在用户空间。read其实也有缓存,但空间不大。一般来说使用fread比使用read的效率更高。

 如果文件的大小是8k。你如果用read/write,且只分配了2k的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。
 如果你用fread/fwrite,则系统自动分配缓存,则读出此文件只要一次系统调用从磁盘上读出。

        但在接近底层时,使用read函数更合适一些,这样避免了数据进入用户空间,内核直接实现,效率更高。

        系统调用和库函数的区别:

a.调用形式不同:

        1.函数一般使用调用指令,其转向地址是固定不变的,包含在跳转语句中;

        2.系统调用中不包含程序入口。而仅仅提供功能号,按功能号调用。

b.被调用代码的位置不同:

        1.函数调用是一种静态调用,调用者和被调用代码在同一程序内,经过链接编译后作为目标代码的一部分。当函数升级或者修改时,必须重新编译链接。

        2.系统调用是一种动态调用,系统调用的处理代码在调用程序之外,这样一来,系统调用处理代码升级或者修改时,与调用程序无关。而且,调用程序的长度也大大缩短,减少了调用程序占用的存储空间。

c.提供方式不同:

        1.函数往往由编译系统提供,不同编译系统提供的函数可以不同;

        2.系统调用由操作系统提供,一旦操作系统设计好,系统调用的功能、种类与数量便固定不变了。

d.调用实现不同:

        1.程序使用一般机器语言来调用函数,是在用户态运行的。

        2.程序执行系统调用,是通过中断机构来实现的,需要从用户态转变为内核态。在管理状态执行,因此安全性好。