01.UNIX基础知识

1、UNIX体系结构

什么叫做内核?

内核是一种软件,它控制计算机硬件资源,并提供程序的运行环境。

 

什么叫操作系统?

在广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,如可以向用户提供服务之类的。

 

什么是系统调用?

内核的接口被称为系统调用。公用函数库构建在系统调用接口上,应用软件既可使用公用函数库,也可使用系统调用。

 

2、文件和目录

创建新目录的时候会自动创建两个文件名:.和..。

在根目录下,这两个文件是同一个文件。

 

目录是一个包含许多目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名。(参考《鸟哥的私房菜》)

UNIX文件系统的大多数实现并不在目录项中存放属性,这是因为当一个文件具有多个硬链接时,很难保持多个属性副本之间的同步。

 

以斜线开头的路径名称为【绝对路径】,否则则为【相对路径】。

根文件的名字/是一个特殊的绝对路径名,它不含文件名。

 

stdin、stdout和stderr都属于文件,所以可以使用fgets(buf,MAXLINE,stdin);从标准输入中读入一行。

 

3、输入和输出

文件描述符是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。

 

按惯例,每当运行一个程序时,所有的shell都为其打开三个文件描述符:标准输入、标准输出以及标准出错。一般情况,这三个描述符都链向终端,但shell也提供一种方法,使其中任何一个或所有三个描述符都能重新定向到某个文件,例如:

ls > file.list

即标准输出到file.list文件,而非终端。

 

函数open、read、write、lseek以及close提供了不用缓冲的I/O,这些函数都使用了文件描述符。

例子:

	#define BUFFSIZE        4096

	int main()
	{
		int n;
		char buf[BUFFSIZE];

		while((n = read(STDIN_FILENO,buf,BUFFSIZE)) > 0) {
			if(write(STDOUT_FILENO,buf,n) != n) {
				printf("write error!");
				exit(1);
			}

			if(n < 0) {
				printf("read error!");
				exit(1);
			}
		}

		exit(0);
	}

或者

相对于不带缓冲的I/O函数而言,标准I/O函数提供了带缓冲的接口。

【原文:The standard I/O functions provide a buffered interface to the unbuffered I/O functions.】

	int main()
	{
		char c;

		while((c = getc(stdin)) != EOF) {
			if(putc(c,stdout) == EOF) {
				printf("output error!");
				exit(1);
			}

			if(ferror(stdin)) {
				printf("input error!");
				exit(1);
			}
		}

		exit(0);
	}

在运行终端上:

./test < infile > outfile

此时STDIN_FILENO描述符表示infile,STDOUT_FILENO描述符表示outfile。

 

4、程序和进程

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

 

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

与进程相同,线程也用ID标识。但是,线程ID只在它所属进程内起作用。一个进程中的线程ID在另一个进程中并无意义。

 

5、用户标识

用户ID为0的用户为根或超级用户。

 

6、信号

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

 

7、时间值

进程时间。也称为CPU时间,用以度量进程使用的*处理机资源。

当度量一个进程的执行时间时,UNIX系统使用三个进程时间值:

a、时钟时间。

b、用户CPU时间。

c、系统CPU时间。

时钟时间是进程运行的时间总量。

用户CPU时间是执行用户指令所用的时间。

系统CPU时间是为该进程执行内核程序所经历的时间(系统调用所耗时间)。例如read或write,在内核内执行所花费的时间就计入该进程的系统CPU时间。

用户CPU时间和系统CPU时间之和常被称为CPU时间。

 

8、系统调用和库函数

系统调用和库函数都以C函数的形式出现。必要时我们可以替换库函数,而通常却不能替换系统调用。

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