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);//返回值:指向信息字符串的指针
char *strerror(int errnum);//返回值:指向信息字符串的指针
此函数将errnum(它通常就是errno值)映射为一个出错信息字符串,并返回此字符串的指针
perror函数基于errno的当前值,在标准出错上产生一个出错信息,然后返回。
#include<stdio.h>
void perror(const char *msg);
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)通常由用户应用程序直接调用。
相关阅读
Android NDK开发中,JNI把Java中的数组也当是引用数据类型。并且提供了对应的的函数访问Java数组。那么你知道都有哪些方法以及如何