【UNIX环境高级编程】UNIX基础知识

【UNIX环境高级编程】UNIX基础知识

1.UNIX体系结构

从严格意义上,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境,我们称这种软件为内核

内核的接口称为系统调用。公用函数库构建在系统调用接口之上,应用软件既可使用公用数据库,也可使用系统调用。shell是一种特殊的应用程序,它为运行其他应用程序提供一个接口。

广义上,操作系统包括内核和一些其他软件。这些软件包括系统实用程序、应用软件、shell以及公用函数库。

2.shell

shell是一个命令行解释器,它读取用户输入,然后执行命令。用户通过用终端(交互式shell),有时通过文件(称为shell脚本,shell script)向shell进行输入。

3.文件和目录

3.1文件系统

UNIX文件系统是目录和文件组成的一个层次结构,目录的起点称为,其名字是一个字符\。目录是一个包含许多目录项的文件,在逻辑上,认为每个目录项都包含一个文件名,同时还包含说明文件属性的信息。

3.2 文件名

目录中的各个名字称为文件名。

创建新目录时回自动创建两个文件名:.(点)和..(点-点) 点指当前目录,点-点指父目录

3.3 路径名

一个或多个以斜线分隔的文件名序列构成路径名

绝对路径:是从盘符开始的路径,形如C:\windows\system32\cmd.exe

相对路径:是从当前路径开始的路径,假如当前路径为C:\windows要描述上述路径,只需输入system32\cmd.exe

3.4 工作目录

每个进程都有一个工作目录,有时称其为当前工作目录。所有相对路径名都从工作目录开始。进程可以用chdir函数更改工作目录。

4.程序和进程

4.1 程序

程序是存放在磁盘上,处于某个目录中的一个可执行文件。使用6个exec函数中的一个由内核将程序读入存储器,并使其执行。

4.2 进程和进程ID

程序的执行实例称为进程,某些操作系统用任务表示正被执行的程序。UNIX系统确保每个进程都有一个唯一的数字标识符,称为进程ID。

4.3 进程控制

进程控制的主要函数:

fork、exec和waitpid

4.4 线程和线程ID

一个进程只有一个控制线程,同一时刻只执行一组机器指令。对于某些问题,不同部分使用一个控制线程,可使问题简化。

在一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。因为他们能访问同一存储区,所有各线程在访问共享数据时需要采取同步措施以避免不一致性。

每个线程都有线程ID,它只在所属进程内作用

5.出错处理

当UNIX函数出错时,常返回一个负值,整型变量errno通常被设置为含有附加信息的一个值。

c标准定义了两个函数打印出错信息。

#include<string.h>
char *strerror(int errnum);//返回值:指向信息字符串的指针

此函数将errnum(它通常就是errno值)映射为一个出错信息字符串,并返回此字符串的指针

perror函数基于errno的当前值,在标准出错上产生一个出错信息,然后返回。

#include<stdio.h>
void perror(const char *msg);

首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值得出错信息,最后是一个换行符

6.信号

信号是通知进程已发生某些情况得一种技术。

进程如何处理信号三种选择

  • 忽略该信号,有些信号表示硬件异常

  • 按系统默认方式处理,对于除以0得情况,系统默认是终止进程

  • 提供一个函数pause,信号发生时则调用该函数捕捉信号。

产生信号方式:

  • 中断键(Delete或Ctrl+c)和退出键(Ctrl+\)

  • 调用kill的函数

7.时间值

UNIX系统一直使用两种不同时间值:

(1)日历时间,国际标准时间,系统基本数据类型time_t用于保存这种时间值

(2)进程时间,也称cpu时间,用以度量使用的中央处理机资源。系统基本数据类型clock_t用于保存这种时间值。

UNIX系统使用的三个进程时间值:

  • 时钟时间,又称墙上时钟时间,他是进程运行的时间总量,其值与系统中同时运行的进程数有关。

  • 用户CPU时间,执行用户指令所用的时间

  • 系统CPU时间,该进程执行内核程序所经历的时间。每当一个进程执行一个系统服务,如read或write,则在内核内执行该服务所花费的时间就计入该进程的系统CPU时间

8.系统调用和库函数

系统调用

所有的操作系统都提供多种服务的入口点,程序由此向内核请求服务。各种版本的UNIX实现都提供定义明确、数量有限、可直接进入内核的入口点,这些入口点称为系统调用

系统调用和库函数的差别:系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。从sbrk系统调用和malloc库函数之间的差别就能看出。

进程控制系统调用(fork、exec和wait)通常由用户应用程序直接调用。

猜你喜欢

转载自blog.csdn.net/zhangxiafll/article/details/80955087