本章介绍了全书涉及的重要概念的相关知识。在深入主要章节之前,建议你先阅读该部分内容。 2.1 干嘛要在意? 自1970年起,Unix编程模型就已经以某种形式存在了。当时,Unix在贝尔实验室闪亮问世,随之一起诞生的还有C程序设计语言,或曰C程序设计框架。在随后的数十载中,作为一款可靠、安全和稳定的操作系统,Unix经受住了时间的考验。 Unix编程理念及技术并非一时之风,亦不是新近流行的编程语言。它们已超越了编程语言。无论你是使用C、C++、Ruby、Python、JavaScript、Haskell,还是自己钟意的其他语言,这些技术都有用武之地。 Unix编程模型已经存在了数十载之久,且大部分都没有改变。过去40年里,聪慧的程序员们一直在Unix编程模型中借助多种编程语言来解决各类难题,在接下来的40年里,他们仍将一如既往。 2.2 驾驭神力! 现在我要提醒你,本书所讲述的概念和技术将赐予你强大的力量。有了它,你能够编写出新的软件,理解现有的复杂软件,甚至能将你的职业生涯提升到新的高度。 请记住:能力越大,责任也越大。在阅读的过程中,我会详细告诉你如何获取这种能力,并避开各种陷阱。 2.3 概述 本书并非参考手册,它更像是一份攻略。因为每一章内容都是基于之前的章节,所以为了最有效地利用本书,你应该按章节顺序逐一读下去。读完全书后,你可以利用章节名来查找有关信息,温故而知新。 书中包含了大量的代码示例。我强烈建议你在Ruby解释器中逐一运行这些代码。自己动手调试有助于更深入地理解概念。 一旦读完全书并把玩过那些示例,你肯定想要接触一些更具深度的实际项目。那时,你可以看看书中提到的Spyglass项目。 Spyglass是一个专门为本书编写的Web服务器,旨在传授Unix编程概念。它采用了你在这里学习到的各种概念,并展示了如何将其应用于真实的项目之中。有关详细介绍请参阅本书最后一章。 2.4 系统调用 要理解系统调用,首先需要了解Unix系统的组成,具体来说就是用户空间(userland)和内核。 Unix系统内核位于计算机硬件之上,它是与硬件交互的中介。这些交互包括通过文件系统进行读/写、在网络上发送数据、分配内存,以及通过扬声器播放音频。鉴于它这些强大的能力,程序不可以直接访问内核,所有的通信都是通过系统调用来完成的。 系统调用为内核和用户空间搭建了桥梁。它规定了程序与计算机硬件之间所允许发生的一切交互。 所有的程序都运行在用户空间。就算是不借助系统调用,你的用户空间程序仍旧能做不少事情:数学运算、字符串操作,以及使用逻辑语句控制程序流程。不过我敢说,如果你打算让程序做些有意思的事情,那就还是得通过系统调用来使用内核。 如果你是一名C程序员,那么这些内容你可能已经驾轻就熟了。系统调用可谓是C编程的核心。 我估计你像我一样毫无C编程经验。你学习的是高级语言编程。在你学会将数据写入文件系统的时候,对于使用了哪些系统调用却并不 知情。 总地来说,系统调用允许你的用户空间程序通过内核间接地与计算机硬件进行交互。在本书接下来的章节中,我们会考查一些常见的系统调用。 2.5 命名法,wtf(2) 学习Unix编程的障碍之一就是不知道从哪里查找合适的文档。想不想听点出人意料的回答?其实所有东西都包含在Unix手册页(manpages)中了。如果你在用Unix系统,那么这些东西都已经在你的计算机里了。 要是你以前压根就没有用过手册页,那么你可以在终端中输入命令man man进行查看。 不错吧?嗯,还算凑合吧。系统调用API的手册页在以下两种情况中是很不错的资源。 (1) 你是一名想知道如何使用特定系统调用的C程序员。 (2) 你想搞明白某个系统调用的用途。 这里假设我们都不是C程序员,所以第一种情况就没什么用了,但是第二种情况却是相当受用。 你在整本书中都会看到类似于select(2)这样的引用。它告诉你可以从哪里找到特定系统调用的手册页。你可能有所不知,Unix手册页包含了很多节(section)。 以下是FreeBSD和Linux系统手册页中最常用的节: 节1:一般命令 节2:系统调用 节3:C库函数 节4:特殊文件 因此,节1专门用于一般命令,也就是shell命令。如果我希望你参考find命令的手册页,我就会这样写:find(1)。这就是说在手册页的节1你可以找到find的使用说明。 如果我希望你参考getpid系统调用的手册页,我就会这样写:getpid(2)。这就是说在手册页的节2你可以找到getpid的使用说明。 为什么手册页还要分这么多节?因为一个命令可能在不止一节中出现,也就是说它既可以作为shell命令,也可以作为系统调用。 例如stat(1)和stat(2)。 要查看手册页的其他节,你可以像这样在命令行上输入: $ man 2 getpid $ man 3 malloc $ man find # 等同于man 1 find 这种记法并非本书所独创,而是大家参照手册页时通用的一套惯例 。所以你最好还是从现在开始学习并适应它。 2.6 进程:Unix之本 进程乃Unix系统的基石。为什么要这么说?因为所有的代码都是在进程中执行的。 例如,当你从命令行运行ruby时,你的代码就生成了一个新的进程。代码执行完毕,进程也随之退出。 $ ruby -e "p Time.now" 在你系统中运行的所有代码皆是如此。你知不知道一直运行的MySQL服务器?它运行在自己的进程中。你正在使用的电子阅读器软件呢?它也是运行在自己的进程中。那些声嘶力竭通知你收到了新消息的电子邮件客户端呢?别搭理它,接着看书。不过它同样也是运行在自己的进程中。 当你认识到一个进程可以生成并管理其他多个进程的时候,事情就变得有意思了。我们会在后面的部分讨论这些内容。
理解Unix进程——第二章:基础知识
书名: 理解Unix进程
作者: Jesse Storimer
出版社: 人民邮电出版社
原作名: Working With Unix Processes
译者: 门佳
出版年: 2013-6
页数: 116
定价: 29.00元
丛书: 图灵程序设计丛书
ISBN: 9787115316899