学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
0.目录
1.概念
2.系统资源
3.学习方法
4.从用户的角度来理解 Unix
- 4.1 登录——运行程序——注销
- 4.2 目录操作
- 4.3 文件操作
5.从系统的角度来理解 Unix
- 5.1 网络桥牌
- 5.2 bc:Unix 的计算器
- 5.3 从 bc/dc 到 Web
6.小结
1.概念
概念:
- Unix 系统包含用户程序和系统内核
- 内核由多个子系统构成
- 内核管理所有的程序和资源
- 进程之间的通信对 Unix 程序是很重要的
- 什么是系统编程
相关命令:
- bc
一些术语:
- 内存空间用来存放程序和数据,所有的程序都必须在内存空间中才能运行。
- 用来容纳操作系统的内存空间叫做系统空间,容纳应用程序的内存空间叫做用户空间。
- 操作系统也被称为内核。
什么是系统编程:
- 程序要访问设备(如键盘、磁盘和打印机)必须通过内核,所以只有内核才能直接管理设备。程序如果要从键盘得到数据,必须向内核发出请求,若在显示器上显示结果,也要通过内核,程序中所有对设备的操作都是通过内核进行的。内核向程序提供服务以便程序能够访问到设备。
- 解释了这些内容后,再来看什么是系统编程。编写普通程序时可以认为,程序是直接连到键盘、显示器、磁盘等设备的,但在进行系统编程时,必须对系统的结构和工作方式有更深的了解,要知道内核提供哪些服务( 系统调用 ),如何使用它们,系统有哪些资源和设备,不同的资源和设备该如何操作。
2.系统资源
内核提供服务以便系统程序可以直接访问系统资源,那么有哪些系统资源和服务呢?
- 处理器(Processor)
- 程序是由指令构成的,处理器是执行指令的硬件设备,一个系统中可能有多个处理器。内核能够安排一个程序何时开始执行,何时暂时停止、恢复执行,何时终止执行。
- 输入输出(I/O)
- 程序中所有输入/输出的数据、终端的输入/输出数据还有硬盘输入/输出数据,都必须流经内核,这种集中的处理方式有以下优点:正确性,数据流不会流错地方;有效性,程序员无需考虑不同设备之间的差异;安全性,数据信息不会被未被授权的程序非法访问。
- 进程管理(Process Management)
- 进程指程序的一次运行,每个进程都有自己的资源,如内存、打开的文件和其他运行时所需的系统资源。内核中与进程相关的服务有新建一个进程、中止进程、进程调度等。
- 内存(Memory)
- 内存是计算机系统中很重要的资源,程序必须被装载到内存中才可以运行。内核的职责之一是内存管理,在需要的时候给程序分配内存,当程序不需要的时候回收内存,内核还能够保证内存不被其他的进程非法访问。
- 设备(Device)
- 计算机系统中可以有各种各样的外设,如磁带机、光驱、鼠标、扫描仪和数码摄像机等,它们的操作方式各不相同,内核能屏蔽掉这种差异,使得对设备的操作方式简单而统一。例如,一个程序想要从数码照相机中取出照片存储在计算机中,它只需向内核提出操作该资源的请求即可。
- 计时器(Timers)
- 程序的工作与时间有关,有的需要定时被触发,有的需要等一段时间再开始某个动作,有的需要知道某一个操作消耗的时间,这些都涉及计时器,内核可以通过系统调用向应用程序提供计时器服务。
- 进程间通信(Interprocess Communication)
- 在现实生活中人们通过电话、e-mail、信件、广播、电视等互相通信,在计算机的世界中,不同的进程也需要互相通信,内核提供的服务使进程间通信成为可能。就像电信和邮政提供的服务,通信也是资源。
- 网络(Networking)
- 网络之间的通信可以看作是进程间通信的特殊形式,通过网络,不同主机上的进程,即使使用的是不同操作系统,也可以互相通信。网络通信也是内核提供的服务。
3.学习方法
本书通过以下 3 个步骤来学习:
- 分析程序
- 首先分析现有的程序,了解它的功能及实现原理。
- 学习系统调用
- 看程序都用到哪些系统调用,以及每个系统调用的功能和使用方法。
- 编程实现
- 利用学到的原理和系统调用,自己编程实现原来程序所实现的功能。
以上 3 步可以通过下面 3 个问题来实现:
- 它能做什么?
- 它是如何实现的?
- 能不能自己编写一个?
4.从用户的角度来理解 Unix
4.1 登录——运行程序——注销
用户登陆时,系统启动单独的一个 shell 进程来处理该用户的请求(多用户环境);用户注销时,系统结束分配给该用户的 shell 进程。
4.2 目录操作
用户登录后,可以对自己的文件进行操作。文件中可以有 e-mail、图片、源程序、可执行程序等各种各样的数据。文件被组织在目录中。
目录树:
目录操作命令:
- ls——列出目录内容
- cd——改变当前目录
- cd 命令的作用是改变当前的目录。当刚刚登录到系统中时,当前目录是自己的主目录,可以通过 cd 命令转到其他目录,如:
- cd 命令的作用是改变当前的目录。当刚刚登录到系统中时,当前目录是自己的主目录,可以通过 cd 命令转到其他目录,如:
- pwd——显示当前目录
- mkdir、rmdir——新建、删除目录
目录操作命令的工作原理:
- 涉及到系统怎么保存描述目录树的信息,以及不同目录操作命令对应的对这些信息的修改。
4.3 文件操作
文件存放在目录中,用户文件位于用户自己的主目录中,系统文件位于系统目录中。
文件命名规则:
- 每个文件都有文件名,在大多数的 Unix 系统中,文件名最长可以是 250 个字符,很多字符都可以出现在文件名中,如大小写字符、标点符号、空格、tab,甚至回车符,但是不能包含根目录符号“/”。
文件操作命令:
- cat,more,less,pg——查看文件的内容
- cp——文件复制
- rm——文件删除
- mv——重命名或移动文件
- lpr,lp——打印文件
文件操作命令的工作原理:
同样涉及到系统怎么保存文件的控制信息和文件的数据信息,以及不同的文件操作命令对应的对这些信息的修改。
文件许可权限:
系统中每个用户都有自己的文件,出于很多原因,你不会希望别的用户能够修改自己的文件,甚至读也不行。系统中有一些管理命令,如果使用得不好会对系统造成损害,管理员不希望普通用户也有运行这些命令的权力。这些对文件和命令操作的限制是如何行使的呢?
每个文件都有文件所有者和 3 组许可权限:
5.从系统的角度来理解 Unix
5.1 网络桥牌
许多人都玩网络桥牌这个游戏,世界各地的玩家通过计算机网络连接到一起,游戏开始以后,参加者就可以看到一个共同的牌桌,能够看到别人出的牌,图 1.9 是一个简单的说明。
图 1.9 中有 4 个人,他们每人都有一台计算机,通过网络连接在一起。但图 1.9 中还少了牌桌,下面把它加上,如图 1.10 所示。
图 1.10 中增加了第 5 个实体——牌桌,牌桌位于服务器上,在 4 个玩家的眼里,牌是放在牌桌上的,他们也是通过牌桌才能够开始游戏。
在现实生活中玩牌的时候,人们轮流出牌,但在网络游戏中,是由谁来控制该哪一个人出牌?牌又存放在哪里?某个人手中有几张牌又意味着什么?如何来保证不让两个人有同一张牌?这在现实生活中不会有任何问题,但在虚拟的网络中确实要仔细考虑。
图 1.11 显示了在网络桥牌中的信息流。
网络桥牌的例子展示了 Unix 系统编程中 3 个重要的方面。
- (1) 通信
- 某个用户或进程如何与其他用户或进程交换信息?
- (2) 协作
- 在同一个时刻,网络桥牌的两个用户不会都去拿同一张牌,程序如何来协调多个进程使他们能够没有冲突地访问共享资源?
- (3) 网络访问
- 在这个例子中,互相独立的计算机通过网络连接到一起,那么计算机中的程序是如何来使用网络的呢?
5.2 bc:Unix 的计算器
Unix 系统中的 bc 命令是执行一个基于字符的计算器程序,bc 有两个重要的特点。
要启动这个计算器,只要输入:
bc 的另一个重要特点是,从严格的意义上讲,bc 并不做任何计算。为了说明这一点,做如下操作:
ps 命令可以列出系统中运行的所有进程,这里一共有 4 个进程,除了两个 bc 外,bash 是 shell 进程,那么 dc 是什么?
在大多数的 Unix 系统中都提供了联机帮助,可以从那里得到需要的信息,要找关于 dc 的信息,只要输入:
读了 bc 的联机帮助就会知道,bc 是 dc 的预处理器,它将用户输入的表达式转换成逆波兰表达式,然后通过一个称为管道(pipe)的通信程序交给 dc,如图 1.12 所示。
用户输入中缀表达式如“2+2”,bc 将它转化为相应的后缀表达式形式,交给 dc 执行,dc 计算表达式的值,将结果返回给 bc,bc 再将结果以合适的形式显示在显示器上。所以对普通用户而言,bc 就是计算器。
5.3 从 bc/dc 到 Web
6.小结
- 计算机系统中包含了很多系统资源,如硬盘、内存、外围设备、网络连接等,程序利用这些资源来对数据进行存储、转换和处理。
- 多用户系统需要一个中央管理程序,Unix 的内核就是这样的程序,它可以对程序和资源进行管理。
- 用户程序要访问设备必须经过内核。
- 一些 Unix 的系统功能是由多个程序的协作而实现的。
- 要编写系统程序,必须对系统调用和相关的数据结构有深人的理解。
最新文章
- BZOJ 3944 Sum
- posgresql
- 我所了解的 京东、携程、eBay、小米 的 OpenStack 云
- Windows Phone的简单学习
- mac os x 安装mysql遇到 Access denied for user 'root'@'localhost' (using password: YES)的解决方法
- CLH锁 、MCS锁
- Leetcode: Guess Number Higher or Lower II
- Uva 10003,切木棍
- MSSQLServer基础05(联合查询,连接查询)
- DBA日常工作职责 - 我对DBA的七点建议
- java多线程编程(1) 线程的基本知识
- 从零基础入门JavaScript(1)
- 【CF689D Friends and Subsequences】二分搜索,区间查询
- SPFA,dijskra,prime,topu四种算法的模板
- ContentProvider总结(Android)
- python paramiko基本
- django中的一对一、一对多、多对多及ForeignKey()
- JavaScript状态模式及状态机模型
- 以太坊钱包开发系列4 - 发送Token(代币)
- Android,XML解析
热门文章
- [c.c.a.m.AgentManagerImpl] (AgentConnectTaskPool-39:ctx-c37090c5) Failed to handle host connection: java.lang.IllegalArgumentException: Can't add host: with h
- 详细解读Spark的数据分析引擎:Spark SQL
- Ubuntu14.04配置gcc4.4.4+Qt4.8.4交叉编译环境
- 20155302《网络对抗》Exp9 Web安全基础
- 2017-2018-2 20155315《网络对抗技术》Exp8 :Web基础
- EJB开发第二期---开发具有本地接口的无状态Bean
- golang高性能端口扫描
- Codeforces Round #546 (Div. 2) E - Nastya Hasn't Written a Legend
- 智能合约bug以及修改方案
- Flask入门的第一个项目