库文件和系统调用的区别
2010年10月25日
本文引自http://hi.baidu.com/printmyheart/blog/item/7fded9dff41a6c1562279894.html
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。可以参考《Linux程序设计》(英文原版为《Beginning Linux Programming》,作者是Neil Matthew和Richard Stones)第三章: Working with files。
1。系统调用
系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h。以write为例:其函数原型为 size_t write(int fd, const void *buf, size_t nbytes),其操作对象为文件描述符或文件句柄fd(file descriptor),要想写一个文件,必须先以可写权限用open系统调用打开一个文件,获得所打开文件的fd,例如 fd=open(\"/dev/video\", O_RDWR)。fd是一个整型值,每新打开一个文件,所获得的fd为当前最大fd加1。Linux系统默认分配了3个文件描述符值:0-standard input,1-standard output,2-standard error。
系统调用通常用于底层文件访问(low-level file access),例如在驱动程序中对设备文件的直接访问。
系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。
系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是对硬件(存储器)的操作,都必然会引起系统调用。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如C库函数fwrite()就是通过write()系统调用来实现的。
这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢?这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲区,例如用fwrite写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。
2。库函数调用
标准C库函数提供的文件操作函数如fopen, fread, fwrite, fclose, fflush, fseek等,需包含头文件stdio.h。以fwrite为例,其函数原型为size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作对象为文件指针FILE *pf,要想写一个文件,必须先以可写权限用fopen函数打开一个文件,获得所打开文件的FILE结构指针pf,例如pf=fopen(\"~/proj/filename\", \"w\")。实际上,由于库函数对文件的操作最终是通过系统调用实现的,因此,每打开一个文件所获得的FILE结构指针都有一个内核空间的文件描述符fd与之对应。同样有相应的预定义的FILE指针:stdin-standard input,stdout-standard output,stderr-standard error。
库函数调用通常用于应用程序中对一般文件的访问。
库函数调用是系统无关的,因此可移植性好。
由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序中对设备的操作
发表评论
-
2008年11月企业培训师真题 理论(单选26-85题)
2012-01-20 11:48 5302008年11月企业培训师真 ... -
[转载]湘教版高中地理必修三:2011年五校第一学期高二
2012-01-20 11:48 857[转载]湘教版高中地理必修三:2011年五校第一学期高二 2 ... -
[转载]主浪和调整浪的特性
2012-01-20 11:48 682[转载]主浪和调整浪的 ... -
湖南省隆回县2011年下学期高二调研试卷语文
2012-01-20 11:48 800湖南省隆回县2011年下学 ... -
js中的常用的几个对象
2012-01-19 16:38 752js中的常用的几个对象 2010年07月01日 jav ... -
(叶全府)常用JavaScript大全
2012-01-19 16:38 561(叶全府)常用JavaScript大全 2010年10月10 ... -
JavaScript内置与本地,宿主函数
2012-01-19 16:38 650JavaScript内置与本地,宿主函数 2011年09月0 ... -
Python 2.7 Tutorial ―― 模块
2012-01-19 16:38 687Python 2.7 Tutorial ―― 模块 2010 ... -
网页制作Javascript经典小技巧
2012-01-19 16:38 579网页制作Javascript经典小技巧 2011年05月26 ... -
arm linux 编译环境建立(文摘)
2012-01-17 06:22 487arm linux 编译环境建立(文摘) 2011年02月2 ... -
计算机概论
2012-01-17 06:22 666计算机概论 2011年04月26日 import 我.认 ... -
探索C++的秘密之一详解extern "C"
2012-01-17 06:22 549探索C++的秘密之一详解extern "C" ... -
10] 建立C帝国(GDAL编译安装以及一般的C库编译步骤)
2012-01-17 06:22 55010] 建立C帝国(GDAL编译安 ... -
浮云 苍狗 哪个无意
2012-01-16 05:03 619浮云 苍狗 哪个无意 2012年01月05日 真相 是 ... -
你妹的蹉跎人森3。
2012-01-16 05:03 617你妹的蹉跎人森3。 13 ... -
神马都是浮云
2012-01-16 05:03 483神马都是浮云 2011年12月21日 爱就疯狂,不爱 ... -
神马才不是浮云年
2012-01-16 05:03 478神马才不是浮云年 2011 ... -
神马浮云1
2012-01-16 05:03 510神马浮云1 2011年03月23日 都三月底了,贵阳的天 ...
相关推荐
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件...通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法
delphi编写so库,及调用实例,linux下运行,Deepin系统
Unity 调用Android文件资源管理器,可以选择Android手机上的图片,视频等一些列文件,并且获得相关的文件路径。直接导入Unity即可运行。测试已经通过
使用electron-edge-js组件调用dll文件的对应方法。
Android快速查找手机文件内某种类型或者某几种类型文件,而且可以调用系统自带工具打开文件,不存在媒体库文件不全的问题。
Windows10 64位系统,VS2013 编程平台...工程二为调用DLL的方法,分为隐式调用和显式调用。两个工程都是控制台应用程序consoleapplication。 对应的文章为 https://blog.csdn.net/u012210613/article/details/88904841
静态库与动态库的区别,以及调用程序在链接静态库和动态库时的区别。如何利用工具查看动态链接库输出的函数,Depends工具的使用,C 编译器名字改编技术对动态链接库输出函数的影响,extern "C"的用法,利用模块定义...
linux 通过模块实现自己的系统调用,文件中有两个文件夹,分别分用户测试程序,和要加载的模块
1初始化文件映射对象 2同步 3获取文件映射对象的映射视图 4释放文件映射对象的映射视图 5释放文件映射对象 源码包含了封装的功能模块类以及测试类, 全部源码都可以用VS2020编译通过,请放心使用! 友情提示,为了...
在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个...
Windows默认自带的音色库
ruby-git, ruby/Git是一个 ruby 库,可以通过将系统调用包装到Git二进制文件来创建读取和操作Git存储库 用于 ruby的 Git库在 ruby 中使用Git的库。主页项目源代码的Git public 位于:...
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了...通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
这里包含编译好的支持加密的so库,支持128位AES,以及Delphi调用需要的文件和示例,这个源码没有充分测试,如有问题就在我的博客上留言。资源分没有办法更改为0,请大家多担待一下,本想免费给大家的,以前是可以不...
DLL动态链接库调用C#源代码DLL动态链接库调用C#源代码DLL动态链接库调用C#源代码
Libraries and System Calls Reference (库和系统调用参考) Complete documentation on the C-callable TNT DOS-Extender system calls in DOSX32.LIB, the C-callable MS-DOS and BIOS system calls in DOS32.LIB...
上上一个资源关于 “C#调用Matlab动态链接库”的,我看评论说运行不了,可能是因为没装Matlab或者Matlab版本和操作系统位数和我编译的dll不匹配,因此我把Matlab原函数文件补充,可自行在Matlab下运用deploytool命令...
java调用C/C++全过程 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种...通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
一、程序能够在多种抽象磁盘上建立文件系统。其中,抽象磁盘可以是: 真正的磁盘 主操作系统中的一个大文件 但是实际上,任何能够看成一系列扇区组合的并且支持对某个扇区进行读写操作的对象,都能视为抽象磁盘,...
调用dll里的全局函数,使用QLibrary,它封装了loadlibrary和getprocaddress,等 freelibrary 要求: 需要知道dll里函数的原型,来写函数指针。 dll放到一个指定的目录下不一定非exe旁边。 DLL_CALL2: 调用dll里...