UNIX 系统概述
1. UNIX体系结构(UNIX Architecture)
调用内核的接口叫做系统调用(system call,图1.1中的阴影部分),普通函数库是建立在系统调用接口的基础之上。应用(application)可以同时使用函数库或者系统调用。Shell是一种特殊的应用,它为运行其他应用提供接口。总的来说,一个操作系统由内核和所有其他的软件组成,这些软件包括系统实用程序,应用,shell,普通的函数库等等。
2. 登录(Logging In)
2.1 登录名
系统在password文件中寻找登录名,通常为文件/etc/passwd。每个用户由7部分组成:登录名:加密密码:用户ID:用户组ID:注释字段:home文件夹:shell程序
所有现代的系统都将加密密码移到了另外一个文件中。
2.2 Shell
一个shell是一个命令行解释器,它读取用户输入并执行命令。用户输入通常从终端中读入,有时候也从文件读入(叫做shell脚本)。我们在图1.2中对使用的shell进行总结:
具体执行哪个shell由passwd文件中最后一个字段指定。
3. 文件和文件夹
3.1 文件系统
UNIX文件系统是文件和文件夹的一个分层布置。文件夹也是一个文件,它包含了文件夹入口。我们可以将每个文件夹入口想象成一个文件名和描述文件属性的结构体的组合。文件的属性包括文件类型(文件,文件夹),文件大小,文件拥有者,文件的访问级别(其他用户是不是可以访问这个文件),还有文件的最后修改时间。我们使用stat和fstat函数来返回包含所有文件属性信息的结构体。
3.2 文件名
只有两个字符不能出现在文件名中,反斜杠“/”和null字符。因为反斜杠用于分隔路径中的文件名,null字符用于终止路径名。
4. 输入和输出
4.1 文件描述符
文件描述符是一个非负整数,内核用它来标识进程访问的文件。
4.2 标准输入,标准输出,标准错误
按照惯例,当一个新的程序运行时,所有的shell都会打开三个描述符:标准输入,标准输出和标准错误。如果没有任何特殊操作,这三个描述符都会被连接到终端。大多数shell都提供了将三个描述符重定向到文件的功能。
4.3 无缓冲I/O
无缓冲I/O由函数open,read,write,lseek和close提供。这些函数同文件描述符一块工作。
#include "apue.h"
#define BUFFSIZE 4096
int
main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > )
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < )
err_sys("read error");
exit();
}
4.4 标准I/O
标准I/O函数为不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无需担心如何选取最佳的缓冲区大小。
我们最熟悉的标准I/O函数是printf。
用标准I/O将标准输入复制到标准输出:
#include "apue.h"
int
main(void)
{
int c;
while ((c = getc(stdin)) != EOF)
if (putc(c, stdout) == EOF)
err_sys("output error");
if (ferror(stdin))
err_sys("input error");
exit();
}
5. 程序和进程
5.1 程序
程序是一个存储在磁盘上某个目录中的可执行文件。内核使用exec函数,将程序读入内存,并执行程序。
5.2 进程和进程ID
程序的执行实例被成为进程(process)。UNIX系统确保每个进程都有一个唯一的数字标识符,称为进程ID。进程ID为非负整数。
5.3 进程控制
有三个用于进程控制的主要函数:fork,exec和waitpid(exec有七种变体,但经常把它们统称为exec函数)
5.4 线程和线程ID
多个控制线程可以使得某些问题解决起来更加容易,并能充分利用多处理器系统的并行行为。
一个进程内的所有线程共享同一地址空间、文件描述符、栈以及进程相关的属性。因为他们要访问同一存储区,因此各线程在访问共享数据时需要采取同步错误以避免不一致性。
线程也用ID标识,一个进程中的线程ID在另外一个进程中没有意义。
6. 出错处理
当UNIX系统函数出错时,通常会返回一个负值,而且整型变量errno通常被设置为具有特定信息的值。有些函数对于出错使用另外一种约定而不是返回负值。例如大多数返回对象指针的函数在出错时会返回一个null指针。
Linux支持多线程存取errno:
extern int *_ _errno_location(void);
#define errno (*_ _errno_location())
对于errno应当注意两条规则。第一条是:如果没有出错,其值不会被例程清除。第二条是:任何函数都不会将errno值设置为0.
6.1 出错恢复
可将在<errno.h>中定义的各种出错分成两类:致命性的和非致命性的。致命性的错误无法恢复。只能打印日志。对于非致命性的错误,有时可以较为妥善的进行处理。
7. 用户标识
7.1 用户ID
口令文件登录项中的用户ID是一个数值,它向系统标识各个不同的用户。
用户ID为0的用户为根用户(root)或超级用户(superuser)。在口令文件中,通常有一个登录项,其登录名为root,我们称这种用户的特权为超级用户特权。超级用户对系统具有自由的支配权。
7.2 组ID
口令文件登录项也包括用户的组ID,它是一个数值。在口令文件中有多个登录项具有相同的组ID。组被用于将若干用户集合到项目或部门中去。这种机制允许同组的各个成员之间共享资源(如文件)。
组文件通常是/etc/group。
8. 信号
信号用于通知进程发生了某种情况。进程有三种处理信号的方式。
- 忽略信号。
- 按系统默认方式处理。对于除数为0,系统默认方式是终止该进程。
- 提供一个函数,信号发生时调用该函数,这被称为捕捉该信号。
9. 时间值
历史上UNIX系统使用过两种不同的时间值。
- 日历时间。这个值是UTC时间(1970年1月1日 00:00:00)这个特定时间以来所经过的描述累计值。系统基本数据类型time_t用来保存这种时间值。
- 进程时间。也被称为CPU时间,用以度量进程使用的中央处理器资源。进程时间以始终滴答计算。系统基本数据类型clock_t保存这种时间值。
当度量一个进程的执行时间时,UNIX系统为一个进程维护了三个进程时间值:
- 时钟时间,它是进程运行的时间总量,其值与系统中同时运行的进程数有关。
- 用户CPU时间;它是执行用户指令所用的时间量。
- 系统CPU时间。它是该进程执行内核程序所经历的时间。
可以用time命令来获取上述三个时间值。
10. 系统调用和库函数
所有操作系统都提供多种服务的入口点,由此程序向内核请求服务。各版本的UNIX实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点被称作系统调用。
库函数可能会调用一个或者多个内核的系统调用,但是它们并不是内核的入口点。
应用程序既可以调用库函数也可以调用内核函数。
UNIX 系统概述的更多相关文章
- linux学习笔记:第二单元 UNIX和Linux操作系统概述
第二单元 UNIX和Linux操作系统概述 UNIX是什么 UNIX操作系统的特点 UNIX 与Linux的关系 GNU项目与自由软件 GUN计划 自由软件意味着什么 Linux简介 Linux是什么 ...
- Unix 和· Linux 系统概述
一.Unix 1.Unix 定义 Unix 是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序 '2.Unix 特点 ① 多用户:在同一时刻可以有多个用户同时使用Unix操作 ...
- JFS 文件系统概述及布局分析
JFS 文件系统概述及布局分析 日志文件系统如何缩短系统重启时间 如果发生系统崩溃,JFS 提供了快速文件系统重启.通过使用数据库日志技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态,而非日 ...
- Unix/Linux笔记全集
1:Unix/Linux操作系统概述 要求:理解应用软件和操作系统的区别,掌握系统的Kernel(核心)和shell(外壳)之间的关系以及各自的作用 Solaris:Solaris 是Sun Micr ...
- 【Linux基础】Unix与Linux操作系统介绍
一.Unix和Linux操作系统概述 1.Unix是什么 UNIX是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序. 2.Unix特点 (1)多用户:在同一时刻可以有多个用 ...
- 操作系统概述(os 笔记一)
操作系统概述 操作系统的目标和功能 1.目标:作为用户/计算机接口 计算机的使用人群大致可以分为三类,终端用户,程序开发者,操作系统设计人员. 对于终端用户,即应用程序的用户来说,他们通常不关注计 ...
- Linux与其它类Unix内核的比较
单块结构的内核:由几个逻辑上独立的成分构成,单块结构,大多数据商用Unix变体也是单块结构: 编译并静态连接的传统Unix内核:Linux能自动按需动态地装载和卸载部分内核代码(模块),而传统Unix ...
- Unix操作系统的入门与基础
http://dev2dev.cnblogs.com/archive/2005/10/10/251894.aspx Unix操作系统的入门与基础 与大家熟悉的Windows用户界面和使用习惯不同,Un ...
- Ansible 系统概述与部署
Ansible 系统概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet但是有一个不同和优点是我们不需要在节点中安装 ...
随机推荐
- 转载 感受K2.Net 2003工作流解决方案
接触SourceCode公司的工作流产品K2.NET 2003有一段时间了,想把一些心得分享出来,和各位共同探讨一下,抛砖引玉,希望能对相关人士以启发. K2.Net 2003是基于微软.Net Fr ...
- 用excel.php类库导出excel文件
excel.php是个小型的php类库,可以满足基本的从数据库中取出数据然后导出xls格式的excel文件,代码如下: 1 class Excel { 2 public $filename = 'ex ...
- iOS开发之iOS程序的启动过程
程序启动的完整过程: (1)main函数 (2)UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 (3)delega ...
- 【已解决】Windows下 MySQL大小写敏感 解决方案及分析
Windows下 MySQL大小写敏感配置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-3-27 最近在window ...
- 【Yii系列】最佳实践之后台业务框架
缘起 上面的几章都讲概念了,没有怎么讲到实践的东西,可能会有些枯燥,这很正常的,概念还是需要慢慢啃的,尤其是官网其他的部分,需要狠狠的啃. 什么,你啃不动了?看看官网旁边的那个在线用户吧. 你不啃的时 ...
- Unity3D动态读取外部MP3文件给AudioSource
在PC端VR游戏开发中,需要动态加载本地的MP3文件,但是Unity3D不知道出于什么原因,到5.4.0也不支持MP3文件的外部加载(目前只支持wav和ogg). 因此要想通过www来加载mp3文件就 ...
- unity插件开发——一个例子:简单的svn集成
在unity开发过程中,通常我们习惯性地在Windows操作系统下使用svn进行版本管理,而每次提交更新,都需要回到文件夹下的这种操作让人无法忍受.是不是可以集成svn到unity中呢?查了一圈uni ...
- Python可视化学习(2):Matplotlib快速绘图基础
Matplotlib将大部分的绘图对象都封装成为对象,故理论上所有的图表元素(如Line2D, Text,Label等)都是对象,都可以将其在图表中提取出来并配置实例的属性.同时,Matplotlib ...
- 用exe4j将jar包转成.exe文件的教程
标准版教程再这里 http://pan.baidu.com/s/1i3gn0Br 1. 下载安装exe4j文件,并把你的java文件生成jar格式的文件,在桌面新建一个文件夹,把jar文件放进去 ...
- 读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”
智能指针的行为像是指针,但是没有提供加的功能.例如,Item 13中解释了如何使用标准auto_ptr和tr1::shared_ptr指针在正确的时间自动删除堆上的资源.STL容器中的迭代器基本上都是 ...