Linux系统调用和库函数

1.     库函数和系统调用

 

Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思,面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性

系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性

系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是对硬件(存储器)的操作,都必然会引起系统调用。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如C库函数fwrite()就是通过write()系统调用来实现的

这样的话,使用库函数也有系统调用的开销为什么不直接使用系统调用呢?这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲区,例如用fwrite写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。

Linux系统调用非常精简(只有250个左右),它继承了UNIX系统调用中最基本和最有用的部分。这些系统调用按照功能逻辑大致可分为进程控制、进程间通信、文件系统控制、存储管理、网络管理、套接字控制、用户管理等几类。

以下链接给出了常见Linux系统调用的列表。

http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html

 

2.举例分析:ANSI库函数和POSIX系统调用


http://blog.sina.com.cn/s/blog_533074eb0101173o.html

 

(1)UNIX环境下的C 对二进制流文件的读写有两套班子:

1) fopen,fread,fwrite; 2) open, read, write

这里简单的介绍一下他们的区别。
1. fopen 系列是标准的C库函数;open系列是 POSIX 定义的,是UNIX系统里的system call。
也就是说,fopen系列更具有可移植性;而open系列只能用在 POSIX 的操作系统上
2. 使用fopen 系列函数时要定义一个指代文件的对象,被称为“文件句柄(file handler),是一个结构体;而open系列使用的是一个被称为“文件描述符 (file descriptor)的int型整数。
3. fopen 系列是级别较高的I/O,读写时使用缓冲;而open系列相对低层,更接近操作系统,读写时没有缓冲。由于能更多地与操作系统打交道,open系列可以访问更改一些fopen系列无法访问的信息,如查看文件的读写权限。这些额外的功能通常因系统而异。
4. 使用fopen系列函数需要"#include <sdtio.h>";使用open系列函数需要"#include <fcntl.h>" ,链接时要之用libc(-lc)
小结:
总的来说,为了使程序获得更好的可移植性,未到非得使用一些fopen系列无法实现的功能的情况下,fopen系列是首选。

 

(2)主要相关函数 read/write、fread/fwrite、open/fopen 区别

1 http://bbs.chinaunix.net/thread-4060202-1-1.html

fread是带缓冲的,read不带缓冲

fread带缓冲,是指在应用层带缓冲。

read也是带了缓存的,在用户看不到的系统层,当然,也可以是不带缓冲。

 其实feadread的区别是,fread并不一定每次者会调用read

fread在应用层实现了缓存。所以

你做以下操作:

1. 打开文件

2. 读文件 04K  (FreadRead

3. 其它操作

4. 读文件 13K  (FreadRead

5. 关文件

 

如果你用read,则步骤4要调用内核

但如果你用的fread,则因为步骤2,缓存中已有所需内容,直接可以返回给你,不用再次调用内核。

两者各有好处,这种情况下fread被认为比较高效

read能够实时反映文件的内容,如果该文件可能被其它进程更改的话


2,fopen
是标准c里定义的,openPOSIX中定义的.
3,fread
可以读一个结构. readlinux/unix中读二进制与普通文件没有区别
.
4,fopen
不能指定要创建文件的权限.open可以指定权限.
5,fopen
返回指针,open返回文件描述符(整数).
6,linux/unix
中任何设备都是文件,都可以用open,read.

(3)使用场合及建议
        都用fread fwrite,它自动分配缓存,速度会很快,比自己来做要简单。如果要处理一些特殊的描述符,用read write,如套接口,管道之类的
系统调用write的效率取决于你buf的大小和你要写入的总数量,如果buf太小,你进入内核空间的次数大增,效率就低下fwrite会替你做缓存,减少了实际出现的系统调用,所以效率比较高。
        如果只调用一次(可能吗?),这俩差不多,严格来说write要快一点点(因为实际上fwrite最后还是用了write做真正的写入文件系统工作),但是这其中的差别无所谓。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值