系统调用、POSIX、C库、系统命令和内核函数
2010年12月06日
系统调用、POSIX、C库、系统命令和内核函数
(1)系统调用和POSIX。
系统调用虽然是内核和用户应用程序之间的沟通桥梁,是用户应用程序访问内核的入口点,但通常情况下,应用程序是通过操作系统提供的应用编程接口(API)而不是直接通过系统调用来编程。
操作系统API的主要作用是把操作系统的功能完全展示出来,提供给应用程序,基于该操作系统,与文件、内存、时钟、网络、图形、各种外设等互操作的能力。此外,操作系统API通常还提供许多工具类的功能,比如操纵字符串、各种数据类型、时间日期等。
在UNIX世界里,最通用的操作系统API基于POSIX(Portable Operating System Interface of UNIX,可移植操作系统接口)标准。POSIX的诞生和UNIX的发展密不可分,UNIX于20世纪70年代诞生于Bell lab,并于20世纪80年代向美各大高校分发V7版的源码以做研究。UC Berkeley在V7的基础上开发了BSD UNIX。
后来很多商业厂家意识到UNIX的价值也纷纷以Bell Lab的System V或BSD为基础来开发自己的UNIX,较著名的有Sun OS、AIX、VMS等。虽然这带来了UNIX的繁荣,但由于各厂家对UNIX的开发各自为政,UNIX的版本相当混乱,给软件的可移植性带来很大困难,对UNIX的发展极为不利。
为结束这种局面,IEEE制订了POSIX标准,目标是提供一套大体上基于UNIX的可移植操作系统标准,提高UNIX环境下应用程序的可移植性。然而,POSIX并不局限于UNIX。许多其他的操作系统,例如DEC OpenVMS和Microsoft Windows NT,都支持POSIX标准
POSIX标准定义了"POSIX兼容"的操作系统所必须提供的服务。Linux兼容于POSIX标准,提供了根据POSIX而定义的API函数。这些API函数和系统调用之间有着直接的关系,一个API函数可以由一个系统调用实现,也可以通过调用多个系统调用来实现,还可以完全不使用任何系统调用。
(2)系统调用和C库。
操作系统API通常都以C库的方式提供,Linux也是如此。C库提供了POSIX的绝大部分API,同时,内核提供的每个系统调用在C库中都具有相应的封装函数。系统调用与其C库封装函数的名称常常相同,比如,read系统调用在C库中的封装函数即为read函数。
C库中的系统调用封装函数在最终调用到相应系统调用之前,往往不做多少额外的工作。不过,某些情况下会有些例外,比如对于两个相关的系统调用truncate和truncate64,C库中的封装函数truncate函数即需要决定它们中的哪个应该最终被调用。
当然,如图5.1所示,系统调用和C库函数之间并不是一一对应的关系。可能几个不同的函数会调用到同一个系统调用,比如malloc函数和free函数都是通过brk系统调用来扩大或缩小进程的堆栈,execl、execlp、execle、execv、execvp和execve函数都是通过execve系统调用来执行一个可执行文件。
也有可能一个函数调用多个系统调用。更有些函数并不依赖于任何系统调用,比如strcpy函数(复制字符串)和atoi函数(转换ASCII为整数),因为它们并不需要向内核请求任何服务。
498)this.style.width=498;" height=240> 图5.1 C库函数与系统调用
实际上,从用户的角度看,系统调用和C库之间的区别并不重要,他们只需通过C库函数完成所需功能。相反,从内核的角度看,需要考虑的则是提供哪些针对确定目的的系统调用,并不需要关注它们如何被使用。
(3)系统调用与系统命令。
系统命令位于C库的更上层,是利用C库实现的可执行程序,比如最为常用的ls、cd等命令。
strace工具可以跟踪命令的执行,使用希望跟踪的命令为参数,并显示出该命令执行过程中所使用到的所有系统调用。比如,如果希望了解在执行pwd命令时都调用了哪些系统调用,可以使用下面的命令:
$strace pwd
结果会产生大量的信息,显示出pwd命令执行过程中所调用到的各个系统调用:
…… write(1, "/usr/src/linux-2.6.23\n", 22/usr/src/linux-2.6.23) = 22 close(1) = 0 munmap(0xb7f5a000, 4096) = 0 exit_group(0)
(4)系统调用和内核函数。
内核函数与C库函数的区别仅仅是内核函数在内核实现,因此必须遵守内核编程的规则。
系统调用最终必须具有明确的操作。用户应用程序通过系统调用进入内核后,会执行各个系统调用对应的内核函数,即系统调用服务例程,比如系统调用getpid的服务例程是内核函数sys_getpid。
系统调用服务例程之外,内核中存在着大量的内核函数。有些局限于某个内核文件自己使用,有些则是export出来供内核其他部分共同使用。对于export出来的内核函数,可以使用ksyms命令或通过/proc/ksyms文件查看。
发表评论
-
jQuery 获取屏幕高度
2013-12-26 01:32 542做手机Web开发做浏览器兼容用到了,所以在网上找了些汇总下。 ... -
jQuery-事件绑定与事件委托
2013-12-26 01:31 775jQuery中给DOM元素添加事件处理程序常用的方式: $(& ... -
深入分析Flex[Bindable]及使用方法
2012-01-20 01:21 424深入分析Flex[Bindable]及使用方法 2010年0 ... -
页面中嵌入FLEX应用-传参
2012-01-20 01:21 723页面中嵌入FLEX应用-传参 2010年06月29日 项 ... -
用Parsley实现Flex Ioc的简单例子
2012-01-20 01:21 661用Parsley实现Flex Ioc的简单例子 2010年0 ... -
Flex嵌入jsp开发心得
2012-01-20 01:21 505Flex嵌入jsp开发心得 2010年07月02日 PM ... -
flex与数据库交互
2012-01-20 01:21 359flex与数据库交互 2010年07月04日 Flex最 ... -
大全【极有收藏价值的】
2012-01-19 09:11 430大全【极有收藏价值的 ... -
提高小学作文实效性的思考
2012-01-19 09:11 351提高小学作文实效性的思考 2010年11月17日 摘要: ... -
小学生评语大全
2012-01-19 09:11 520小学生评语大全 2011年07月14日 你是一位可爱的小 ... -
小学生期末评语经典大全
2012-01-19 09:11 608小学生期末评语经典大全 2011年12月15日 1.你是 ... -
超级爆笑小学生作文大全,这孩子太搞了
2012-01-19 09:11 583超级爆笑小学生作文大全,这孩子太搞了 2011年11月03日 ... -
操作系统总结(除课后计算题外)
2012-01-17 01:40 725操作系统总结(除课后计算题外) 2012年01月12日 ... -
Linux基础学习 收藏
2012-01-17 01:40 630Linux基础学习 收藏 2011年06月24日 Lin ... -
2011-9-13
2012-01-17 01:40 4972011-9-13 2011年09月13日 JavaSE ... -
linux共享内存
2012-01-17 01:40 638linux共享内存 2010年07月 ... -
JAVA经典32问
2012-01-17 01:40 503JAVA经典32问 2011年12月28 ... -
AS3容器的实现原理
2012-01-15 20:55 911AS3容器的实现原理 2010年07月09日 所谓 ... -
【顶】FLASH教程――目录
2012-01-15 20:55 712【顶】FLASH教程――目录 2009年09月15日 追 ... -
【顶】flash教程――目录
2012-01-15 20:55 709【顶】flash教程――目录 2009年09月15日 F ...
相关推荐
(3) 若程序中调用了 linux 的内核函数,要求深入阅读相关函数源码。 实验二 linux 内核模块编程 设计目的 Linux 提供的模块机制能动态扩充 linux 功能而无需重新编译内核,已经广泛应用在 linux 内核的许多功能的...
6.1 系统调用与应用编程接口、系统命令、内核函数的关系 133 6.1.1 系统调用与API 133 6.1.2 系统调用与系统命令 134 6.1.3 系统调用与内核函数 134 6.2 系统调用处理程序及服务例程 135 6.2.1 初始化系统调用 136 ...
系统调用madvise的作用:建议内核如何使用指定段的内存,可配合mmap使用。函数原型如下: #include int madvise(void *addr, size_t length, int advice);
OpenBSD libc 是 OpenBSD 操作系统自带的 C 标准库实现,它与其他 C 标准库有着一些显著的区别和特点,下面是一些主要的特点: 安全性优先:OpenBSD libc 重视系统安全和可靠性,将其作为设计的首要目标。libc 的...
sync()、fsync()和fdatasync()系统调用 第十六章访问文件 读写文件 内存映射 直接I/O传送 异步I/O 第十七章回收页框 页框回收算法 反向映射 PFRA实现 交换 第十八章Ext2和Ext3文件系统 ...
QNX SDP 7.0: QNX Neutrino RTOS C Library Reference 介绍了 C 函数,包括 POSIX 线程、内核调用和资源管理器函数
9.1.3 处理带外数据 9.2 poll系统调用 9.3 epoll系列系统调用 9.3.1 内核事件表 9.3.2 epoll_wait函数 9.3.3 LT和ET模式 9.3.4 EPOLLONESHOT事件 9.4 三组IO复用函数的比较 9.5 IO复用的高级应用一:非阻塞...
penguin 是一个包罗万象的存储库,用于包装未在 python 标准库中公开的 libc 函数。 到目前为止,我们有: penguin.fds :eventfd、timerfd、signalfd和inotify相关函数 penguin.signals :暴露signalfd需要...
本章所说明的函数经常被称为不带缓冲的I/O ,术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。这些不带缓冲的IO不是ISO C的组成部分,但是,它们是POSIX.1和Single UNIX Specification的组成部分 ...
10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc...
9.1 函数的原型和调用 45 9.2 函数的形参与实参 45 9.3 函数的返回类型与返回值 46 9.4 MAIN函数与EXIT函数与函数的RETURN语句 46 9.5 多个源代码文件程序的编译 47 9.5.1 头文件的使用 47 9.5.2 #include与#define...
10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc...
10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc...
对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分...
对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分...
10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc...