整数)并不
使用任何系统调用。
从实施者的角度,系统调用和库函数之间有重大区别,但从用户角度其区别并不非
常重要。
从本书的目的出发,系统调用和库函数在本书中都以正常的C函数的形式出现。两
者都对应
用程式提供服务,但是,我们应当理解,假如希望的话,我们能够代换库函数,但
是通常我
们却不能代换系统服务。
以存储器分配函数malloc为例。有多种方法能够进行存储器分配及和其相关的无用
区收集操
作(最好适应,首次适应等),并不存在对任何程式都最好的一种技术。Unix系统调
用中处理
存储器分配的是sbrk(2),他不是个通用的存储器管理器。他增加或减少指定字
节数的进
程地址空间。如何管理该地址空间却取决于进程。存储器分配函数malloc(3)实现
一种特定
类型的分配。假如我们不喜欢其操作方式,则我们能够定义自己的malloc函数,极
其可能,
他还是要调用sbrk系统调用。事实上,有很多软件包,他们实现自己的存储器分配
算法,但
仍使用sbrk系统调用。图11显示了应用程式、malloc函数连同sbrk系统调用之间
的关系。
图11〓malloc函数和sbrk系统调用
从中可见,两者职责不同,相互分开,要核中的系统调用分配另外一块空间给进程
,而库函
数malloc则管理这种空间。
另一个可说明系统调用和库函数之间的差别的例子是,Unix提供决定当前时间和日
期的界面
。某些操作系统提供一个系统调用以返回时间,而另一个则返回日期。任何特别的
处理,例
如正常时制和日光节约时制之间的转换,由系统核处理或需要人的干予。Unix则不
同,他只
提供一条系统调用,该系统调用返回国际标准时公元一九七年一月一日午夜以来
所经过的
秒数。对该值的任何解释,例如将其变换成人们可读的,使用本地时区的时间和日
期,都留
给用户进程运行。在标准C库中,提供了若干例程以处理大多数情况。这些库函数
处理各种
细节,例如各种日光节约时算法。
应用程式能够或调用系统调用,或库函数,而很多库函数则会调用系统调用。
这在图1
2中显示。
图12〓C库函数和系统调用之间的差别
另一个系统调用和库函数之间的差别是:系统调用通常提供一种最小界面,而库函
数通常提
供比较复杂的功能。我们从sbrk系统调用和malloc库函数之间的差别中看到了这一
点,在以
后当比较不带缓存的I/O库数(第3章)连同标准I/O标准(在第5章)时,我们还将看到
这种差别
。
进程控制系统调用(fork,exec和wait)通常由用户的应用程式直接调用。(请回忆程
序15中
的基本shell)但是为了简化某些常见的情况,UNIX系统也提供了一些库函数;例如
system和
popen。在812节中,我们将说明system函数的一种实现,他使用基本的进程控制
系统调用
。在1018中,我们还将强化这一实例以正确地处理信号。
为使读者了解大多数程式员应用的Unix系统界面,我们不得不既说明系统调用,只
介绍某些
库函数。例如若我们只说明sbrk系统调用,那么就会忽略很多应用程式使用的mal
loc库函数
。
在本书中,除了一定要将两者相区分时,我们都将使用术语"函数"来涉及系统调用
和库函
数两者。
112〓摘要
本章旋风式地周游了Unix。我们已说明了某些以后会多次用到的基本术语,介绍了
一些小的
Unix程式的实例,从中可想到本书的其余部分将会进一步介绍的内容。
下一章是关于Unix的标准化,连同这方面的工作对当前系统的影响。标准,特别是
ANSI C标
准和POSIX1标准将影响本书的余下部分。
习题
11〓在您的系统上查证,除根目录中外,目录·和··是不同的。
12〓分析程式14的输出,说明进程ID为852和853的进程可能是什么?
13〓在17节中,perror的参数是用ANSI C的属性const定义的,而rerror的整
型参数则
没有用此属性定义,为什么?
14〓附录B包含了出错处理函数err[CD#*2]sys,当调用该函数时,保存了errno
的值,为
什么?
15〓若日历时间存放在带符号的32位(32-bit)整型数中,那么到哪一年他将溢出
?
16〓若进程时间存放在带符号的32位(32-bit)整型数中,而且每秒为100滴答,
那么经过
多少天后该时间值将会溢出?〖LM〗
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



