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也是带了缓存的,在用户看不到的系统层,当然,也可以是不带缓冲。
其实fead和read的区别是,fread并不一定每次者会调用read。
fread在应用层实现了缓存。所以
你做以下操作:
1. 打开文件
2. 读文件 0~4K (Fread或Read)
3. 其它操作
4. 读文件 1~3K (Fread或Read)
5. 关文件
如果你用read,则步骤4要调用内核
但如果你用的fread,则因为步骤2,缓存中已有所需内容,直接可以返回给你,不用再次调用内核。
两者各有好处,这种情况下fread被认为比较高效
但read能够实时反映文件的内容,如果该文件可能被其它进程更改的话
2,fopen是标准c里定义的,open是POSIX中定义的.
3,fread可以读一个结构. read在linux/unix中读二进制与普通文件没有区别.
4,fopen不能指定要创建文件的权限.open可以指定权限.
5,fopen返回指针,open返回文件描述符(整数).
6,linux/unix中任何设备都是文件,都可以用open,read.
(3)使用场合及建议
都用fread
如果只调用一次(可能吗?),这俩差不多,严格来说write要快一点点(因为实际上fwrite最后还是用了write做真正的写入文件系统工作),但是这其中的差别无所谓。
- Linux系统调用和库函数
- Linux系统调用和库函数
- linux系统调用和库函数调用
- Linux系统调用和库函数调用
- Linux系统调用和库函数调用
- linux系统调用和库函数的区别
- 系统调用和库函数
- 库函数和系统调用
- 系统调用和库函数
- 库函数和系统调用
- 库函数和系统调用
- 系统调用和库函数
- 系统调用和库函数
- 系统调用和库函数
- 系统调用和库函数
- 库函数和系统调用
- 库函数和系统调用
- 库函数调用和系统调用
- 2014华为机试题8:压缩字符串
- 最近在做一个读取PDF报UnsatisfiedLinkError错误
- 黑马视频学习笔记- 一些杂项记载
- Shell 编程--本文结合大量实例阐述如何编写一个shell脚本
- 使用HorizontalScrollView和ViewPager联动效果出现的position值改变问题
- Linux系统调用和库函数
- xcode 自定义build Setting
- MVC @model 模型定义
- 关于CCSprite、CCtexture2D与CCImage之间的关系
- System.exit(0)和System.exit(1)区别
- JAVA card 应用开发(七) JAVA 卡数据(永久数据/临时数据)
- android webview setBuiltInZoomControls 与 onTouch 冲突解决
- POJ1503
- 设计模式-抽象工厂(Demo)