系统调用、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文件查看。
发表评论
-
新课标人教版必修五第二单元阅读理解专项训练
2012-01-20 11:41 747新课标人教版必修五第二单元阅读理解专项训练 2011年11月 ... -
2012-1-17
2012-01-20 11:41 5952012-1-17 2012年01月17日 十二星座男生 ... -
小学十一册英语期末测试题(答案)(终于给同学们打完答案了,颈椎已经酸麻。请同学们一定要先认真答题后再对照答案改正。这样才能保证期末考出好成绩!)
2012-01-20 11:41 699小学十一册英语期末测试题(答案)(终于给同学们打完答案了,颈椎 ... -
JS学习---ECMAScript对象
2012-01-19 16:31 601JS学习---ECMAScript对象 2010年11月25 ... -
【转】 Flex远程调用机制RemoteObject应用技巧
2012-01-19 16:31 700【转】 Flex远程调用机 ... -
AS3.0 中root和parent的用法
2012-01-19 16:31 754AS3.0 中root和parent的用法 2011年01月 ... -
javascript中的面向对象编程(一)-乾蓝洛-博客园
2012-01-19 16:31 624javascript中的面向对象编程(一)-乾蓝洛-博客园 ... -
Flex 4中DropDownList的奇怪问题
2012-01-19 16:31 619Flex 4中DropDownList的奇怪问题 2011年 ... -
关于malloc函数后free内存空间的疑问
2012-01-17 06:16 756关于malloc函数后free内存空间的疑问 2011年11 ... -
c库函数和系统调用的区别(很模糊)
2012-01-17 06:16 587c库函数和系统调用的区 ... -
怎样评价学生的习作
2012-01-17 06:16 584怎样评价学生的习作 20 ... -
如何培养小学生写日记的兴趣
2012-01-17 06:16 701如何培养小学生写日记 ... -
神马五一第一天
2012-01-16 04:56 571神马五一第一天 2011年04月30日 神马五一第一天, ... -
神马都是浮云
2012-01-16 04:56 518神马都是浮云 14小时前 看透了好多,也经历的 ... -
在金钱面前一切都是浮云
2012-01-16 04:56 536在金钱面前一切都是浮云 2012年01月12日 神马世界 ... -
? ,浮云。
2012-01-16 04:56 553? ,浮云。 2012年01月11日 ... -
消逝的战场之神马将军
2012-01-16 04:56 564消逝的战场之神马将军 2012年01月14日 还记得小时 ...
相关推荐
(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...