1.1 unix的体系结构
内核(kernel)
系统调用(system call)
库函数
shell
应用程序
1.2 登录
系统口龙文件(/etc/passwd)可以查看登录名,登录项包含7个字段
- username
- password
- uid(user id)
- gid(group id)
- comment
- home directory
- shell
目前所有系统已经将password放到另一个文件中。
shell是一个命令行解释器,用户登录后,
可以向shell输入命令,可通过终端(交互式shell),也可通过文件(shell脚本)
1.3 文件和目录
unix文件系统由目录和文件组成一种层次结构,起始目录称为root('/'),文件属性指文件类型(普通文件或目录)、文件的大小、文件所有者、文件权限(其他用户的访问权限)、文件最后修改时间等。
创建新目录会自动创建两个文件名.(当前目录)和..(父目录)
每个进程都有一个工作目录(working directory),相对路径都从工作目录开始解释,进程可通过chdir()更改工作目录。
1.4输入和输出
文件描述符(file descriptor)是一个非负整数,内核用来标示一个特定进程正在访问的文件。内核打开或创建一个文件时,返回一个文件描述符,可用来读写文件。
标准输入输出
#include <unistd.h>
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
不带缓冲的IO,j即标准IO,包含open/read/write/lseek/close都对文件描述符进行操作。
带缓冲的IO,包含printf/fgets/fputs.
1.5 程序和进程
程序(program)指存放在磁盘的可执行文件,进程(process)指程序的执行实例。每个进程有唯一的非负整数标示符,称为进程ID(process ID)。
有三个用于进程可控制的主要函数:fork、exec和waitpid。(exec包含6中变体)
进程可以有多个控制线程(thread),所有线程共享进程的统一地址空间、文件描述符、栈以及进程相关属性,可访问同一存储区,需要处理好同步关系。
1.6 出错处理
unix函数出错时,返回一个负值,且整数变量errno会设置错误信息。errno在<errno.h>文件中定义
#include <errno.h>
//是否支持多线程
#ifdef SUPPORT_MULTI_THREADS
extern int errno;
#elseexrern int* __errno_locaiton(void);
#define errno (*__errno_locaiton())
#endif//错误编号(!0)
#define EACCESS <???>
#define EPERM <???>
1.7 用户标识
用户ID为0的用户为root,有超级用户特权
组ID,不同用户ID可以拥有相同组ID,可以设置文件权限使相同组ID的用户都能存取该文件,而组外用户不能。
1.8 信号
信号用于通知进程已发生某种情况。进程可以对信号做三种选择的处理
- 忽略该信号
- 按照系统默认方式处理
- 提供一个函数,信号发生时执行该函数(捕捉信号)
1.9 时间值
unix系统使用两种不同的时间
- 日历时间。自1970年1月1日00:00:00以来经过的秒数累计值。
*进程时间。即CPU时间,用来度量进程使用的cpu资源
1.10 系统调用和库函数
系统调用时内核提供的最小接口,仅实现单一的功能,库函数通常提供比较复杂且常有的功能,库函数通过调用系统调用实现。
网友评论