学习《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> # ...
随机推荐
- selenium自动化环境搭建(Windows)
参考内容:虫师<selenium2自动化测试实战-基于python语言> 一.selenium介绍 selenium主要用于web应用程序的自动化测试,还支持所有基于web的管理任务自动化 ...
- Flask安装教程
第1步:确保本机已经安装有python,下载easy_install到本地某一目录,双击ez_setup.py,python将自动下载到python安装目录/Scripts 下面,然后在系统环境变量的 ...
- JS 01 变量_数据类型_分支循环_数组
点击直通车↓↓↓ 数据类型及数据类型的手动转换 数组 一.概念 JavaScript(JS)是一种基于对象和事件驱动.且可以与HTML标记语言混合使用的脚本语言,其编写的程序可以直接在浏览器中解释执 ...
- Compensating-Transaction模式
在应用中,会将一系列相关的操作定义为一个连续的操作,当其中一个或者多个步骤失败的时候,Compensating-Transaction模式会重置(回滚)这个连续的操作.在云应用中,这些需要保证一致性的 ...
- kali黑客渗透测试基础环境准备
1.apt-get install python-nmap 2.apt-get install python-setuptools 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 ...
- 一道面试题来了解线程notifyAll()和wait()的方法
题目:三个线程,分别打印A.B.C,要求按ABC的顺序循环打印10次. package com.slowcity.crud.controller; public class PrintOneTwoTh ...
- Lambda学习---StreamApi使用
package com.zx; import com.zx.entity.Book; import org.junit.Test; import java.time.LocalDate; import ...
- JQuery快速入门-操作元素的属性和样式
我们在学习JavaScript时,详细介绍了DOM对象.从DOM树可以得知,对DOM的操作,主要包括:元素的属性.内容.值.CSS. 一.元素属性的操作 在 jQuery 中,可以对元素的属性执行获取 ...
- rabbitMQ教程(四) spring整合rabbitMQ代码实例
一.开启rabbitMQ服务,导入MQ jar包和gson jar包(MQ默认的是jackson,但是效率不如Gson,所以我们用gson) 二.发送端配置,在spring配置文件中配置 <?x ...
- Qt连接数据库的两种方法
我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...