Linux系统调用和库函数

来源:互联网 发布:云计算 国家政策支撑 编辑:程序博客网 时间:2024/06/05 20:52

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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 衣服肩膀被衣架撑变形了怎么办 货已经安到客户家客户不付款怎么办 微商卖家不给退货不给换货怎么办啊 淘宝卖家已签收退货却不退款怎么办 申请换货卖家收到货不给换怎么办 我买了个机器想退货怎么办 卖家要求退回去又拒收怎么办 拼多多48小时还不发货怎么办 退货退款单号填错了退不了款怎么办 淘宝退货退款快递单号填写错怎么办 蘑菇街退货忘记填快递单号了怎么办 您尝试购买的项目已停止供货怎么办 oppo新手机搬家搬了一半怎么办 开手机店手机卖不出去怎么办 京东买的东西误按签收了怎么办 小米5x充电宝充电自动断电怎么办 小米2s开不了机怎么办充电闪红灯 寄快递写错地址但已经发货了怎么办 拼多多发货时快递公司写错了怎么办 千牛发货信息写错了怎么办 发货物流单电话写错了怎么办 顺丰寄电脑保价后电脑进水了怎么办 微销通分享小程序没有二维码怎么办 京东的东西退掉但是赠品怎么办 买手机7天不给退换怎么办 买的水果拒收了商家不退钱怎么办 京东第三方签收后退货怎么办 京东上买的第三方的鞋子退货怎么办 淘宝买家退货条码不符签收了怎么办 此苹果已丢失并被抹掉怎么办 苹果手机显示已丢失并被抹掉怎么办 手机在保修期内坏了售后拖延怎么办 微信图片在电脑上打印不清楚怎么办 遇到职业搞坏淘宝店铺的买家怎么办 眼破裂伤无光感半个月怎么办 出了虫的豆豆熬稀饭喝了怎么办? 果汁阳台月季叶子掉光了怎么办 近看好看远看难看该怎么办 衣服褶皱没有熨斗的情况下怎么办 裤子磨得发亮怎么办也没有电熨斗 老是在灯箱拍照对眼睛不好怎么办