库文件和系统调用的区别
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库的,因此也就不可能用于内核空间的驱动程序中对设备的操作
发表评论
-
DirectShow技术介绍(长篇)-1
2012-01-20 00:34 868DirectShow技术介绍(长篇)-1 2011年01月1 ... -
Android开发环境安装与配置
2012-01-20 00:34 667Android开发环境安装与配 ... -
WP7 环境准备
2012-01-20 00:34 684WP7 环境准备 2010年06月14日 WPMind. ... -
Visual Studio 2008 SP1 补丁安装时发生严重错误-安装失败-解决方法整合版!-分享
2012-01-20 00:34 2014Visual Studio 2008 SP1 补丁 ... -
win7啊,我的纠结,ip啊
2012-01-20 00:34 1005win7啊,我的纠结,ip啊 201 ... -
程序工具
2012-01-19 01:31 644程序工具 2010年10月15日 开发(Developm ... -
arm linux 编译环境建立(文摘)
2012-01-19 01:31 554arm linux 编译环境建立(文摘) 2011年02月2 ... -
计算机概论
2012-01-19 01:31 496计算机概论 2011年04月26日 import 我.认 ... -
探索C++的秘密之一详解extern "C"
2012-01-19 01:31 582探索C++的秘密之一详解extern "C" ... -
库文件和系统调用的区别
2012-01-19 01:31 551库文件和系统调用的区 ... -
C#面试题集锦(你值得拥有!)
2012-01-17 00:49 580C#面试题集锦(你值得拥 ... -
V4L2驱动的移植与应用(二)
2012-01-17 00:49 774V4L2驱动的移植与应用( ... -
并行 .net 应用程序的过去、现在和未来
2012-01-17 00:49 532并行 .net 应用程序的过去、现在和未来 2011年08月 ... -
计算机概论
2012-01-15 19:37 603计算机概论 2011年04月26日 import 我.认 ... -
探索C++的秘密之详解extern C
2012-01-15 19:37 612探索C++的秘密之详解exte ... -
探索C++的秘密之一详解extern "C"
2012-01-15 19:37 567探索C++的秘密之一详解extern "C" ... -
10] 建立C帝国(GDAL编译安装以及一般的C库编译步骤)
2012-01-15 19:37 66710] 建立C帝国(GDAL编译安 ...
相关推荐
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件...通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法
delphi编写so库,及调用实例,linux下运行,Deepin系统
Unity 调用Android文件资源管理器,可以选择Android手机上的图片,视频等一些列文件,并且获得相关的文件路径。直接导入Unity即可运行。测试已经通过
1、Labview生成Dll文件 2、Java通过Jnative第三方Jar包调用Labview生成的DLL文件 3、Java在Windows系统调用Labview生成的Dll的说明 有JNative的使用说明 直接下载,根据使用说明可以直接使用。
使用electron-edge-js组件调用dll文件的对应方法。
Android快速查找手机文件内某种类型或者某几种类型文件,而且可以调用系统自带工具打开文件,不存在媒体库文件不全的问题。
假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...
Windows10 64位系统,VS2013 编程平台...工程二为调用DLL的方法,分为隐式调用和显式调用。两个工程都是控制台应用程序consoleapplication。 对应的文章为 https://blog.csdn.net/u012210613/article/details/88904841
静态库与动态库的区别,以及调用程序在链接静态库和动态库时的区别。如何利用工具查看动态链接库输出的函数,Depends工具的使用,C 编译器名字改编技术对动态链接库输出函数的影响,extern "C"的用法,利用模块定义...
linux 通过模块实现自己的系统调用,文件中有两个文件夹,分别分用户测试程序,和要加载的模块
Linux 系统调用 fsync 函数详解 fsync 函数是 Linux 系统调用中的一种同步函数,用于将内存中所有已修改的文件数据同步到...fsync 函数是 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命令...