学习《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 的系统功能是由多个程序的协作而实现的。
- 要编写系统程序,必须对系统调用和相关的数据结构有深人的理解。
学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述的更多相关文章
- Go基础编程实践(八)—— 系统编程
捕捉信号 // 运行此程序,控制台将打印"Waiting for signal" // 按Ctrl + C 发送信号以关闭程序,将发生中断 // 随后控制台依次打印"Si ...
- Unix/Linux环境C编程新手教程(21) 各个系统HelloWorld跑起来效果怎样?
版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究. https://blog.csdn.net/yincheng01/article/detail ...
- Unix/Linux环境C编程入门教程(21) 各个系统HelloWorld跑起来效果如何?
Unix/Linux家族人员众多,我们无法一一讲解如何配置环境. 本文选定我们在前面安装的RHEL6 RHEL7 MAC10.9.3 Solaris11如何跑起来helloworld RHEL 6 上 ...
- 学习《Unix/Linux编程实践教程》(2):实现 more
0.目录 1.more 能做什么? 2.more 是如何实现的? 3.实现 more 3.1 more01.c 3.2 more02.c 3.3 more03.c 1.more 能做什么? more ...
- Unix/Linux编程实践教程(0:文件、终端、信号)
本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下. 阅读联机帮助的一个示例: open系统调用: read系统调用: Unix的time: 上面的printf可以 ...
- Unix/Linux编程实践教程(二:socket、多线程、进程间通信)
同一接口不同的数据源: 协同进程: fdopen以文件描述符为参数: fopen和popen: 为了实现popen,必须在子进程中调用sh,因为只有shell本身即/bin/sh可以运行任意shell ...
- Unix/Linux编程实践教程(一:进程、管道)
execvp在程序中启动新程序: 用fork创建新进程: forkdemo2代码: 测试fork的时候参考<Linux权威指南>阅读笔记(3) 使用了patch: [root@local ...
- Unix/Linux编程实践教程(三:代码、测试)
测试logfilec.c的时候,有个sendto(sock,msg,strlen(msg),0,&addr,addrlen),编译时提示: logfilec.c:30: warning: pa ...
- Linux下more命令C语言实现实践 (Unix-Linux编程实践教程)
1. more第一版 实现基础功能,显示每一页固定24行文本,“q Enter”退出, “Enter” 下一行, “space Enter”下一页. #include<stdio.h> # ...
随机推荐
- Android MD5算法
package com.example.myapi.md5; import java.io.UnsupportedEncodingException; import java.security.Mes ...
- Android Layout属性笔记
android:id 为控件指定相应的ID android:text 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串 android:gravity 指定Vi ...
- BZOJ2427: [HAOI2010]软件安装 tarjan+树形背包
分析: 一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环! 有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断 ...
- 百度谷歌雅虎三大搜索引擎比较和如何配置谷歌访问助手访问Google搜索服务
引言: 由于近期网上盛传”百度搜索引擎已死“的消息,引发个人对于搜索引擎的思考.百度作为最大的中文搜索引擎,确实有着很大声誉,再加上本地化的优势,正成为国人们的首选,但是作为一名技术开发人员,使用搜索 ...
- python之Django实现商城从0到1
dailyfresh-B2Cdailyfresh mall based on B2C model 基于B2C的天天生鲜商城 项目托管地址:https://github.com/Ylisen/daily ...
- 20155234 Exp3 免杀原理与实践
使用msf编码器生成jar包 使用指令:msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.157.141 lport=5234 x> ...
- 【来龙去脉系列】AutoMapper一款自动映射框架
前言 通常在一个应用程序中,我们开发人员会在两个不同的类型对象之间传输数据,通常我们会用DTOs(数据传输对象),View Models(视图模型),或者直接是一些从一个service或者Web AP ...
- 05-python基础
1.python是什么? 解释性语言.高级语言.开源.简洁.方便.容易扩展 2.可变类型与不可变类型 可变类型:list.dict.可变集合set 不可变类型:数字,str,tuple元组,froze ...
- vuex实践之路——笔记本应用(一)
首先使用vue-cli把环境搭建好. 介绍一下应用的界面. App.vue根组件,就是整个应用的最外层 Toolbar.vue:最左边红色的区域,包括三个按钮,添加.收藏.删除. NoteList.v ...
- LABVIEW串口通信基础
写这一篇串口通信基础的契机是最近刚刚完成一个温箱的仪器控制程序,LABVIEW通过串口与温箱单片机通讯,我打算将过程中遇到的一些问题和收获列在这里方便有需求的网友比对.寻找答案. 学LABVIEW时间 ...