UNIX读书笔记---UNIX基础知识
目录
UNIX体系结构:
登录:
shell:
文件和目录:
1、文件系统:
2、文件名:
3、路径名:
4、工作目录:
输入输出
1、文件描述符(file descriptor):
2、标准输入、标准输出和标准错误:
3、不带缓冲的IO:
4、标准I/O
程序和进程
1、程序:
2、进程和进程ID:
3、进程控制:
4、线程和线程ID:
时间值:
系统调用和库函数:
目录
UNIX体系结构:
从严格意义上讲,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(Kernel),因为他相对较小,而且位于环境的核心。图片显示了UNIX系统的体系结构。
内核的接口被称为系统调用(system call)。公用函数库构建在系统调用接口只是,应用程序即可使用公用函数库,也可以使用系统调用。shell是一个特殊的应用程序,为运行其他应用程序提供一个接口。
登录:
系统口令文件通常是/etc/passwd。口令文件中的登录项由7个以冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID、注释字段、起始目录(/home/sar)以及shell程序(/bin/ksh)。
目前,所有的系统已将加密口令移到另一个文件中。
shell:
shell是一个命令行解释器,它读取用户输入,然后执行命令。
文件和目录:
1、文件系统:
UNIX文件系统是目录和文件的一种层次结构,所有东西的起点是称为根(root)的目录,这个目录的名称是一个字符“/”。
目录(directory)是一个包含目录项的文件。在逻辑上,可以认为每个目录项都包含一个文件名。同时还包含说明该文件属性的信息。文件属性是指文件类型(是普通文件还是目录等)、文件大小、文件所有者、文件权限(其它用户能否访问该文件)以及文件最后的修改时间等。stat和fstat函数返回包含所有文件属性的一个信息结构。
注:
目录项的逻辑视图与时间存在磁盘上的方式是不同的。UNIX文件系统的大多数实现并不在目录项中存放属性,这是
因为当一个文件具有多个硬链接时,很难保持多个属性副本之间的同步。
2、文件名:
创建新目录时会自动冲击两个文件名:.(称为点)和..(称为点点)。点指向当前目录,点点指向父目录。在最高层次的根目录中,点点与点相同。
3、路径名:
由斜线分隔的一个或多个文件名组成的序列(也可以斜线开头)构成路径名(pathname),以斜线开头的路径名称称为绝对路径(absolute pathname),否则称为相对路径名(relative pathname)。相对路径名指向相对于当前目录的文件。文件系统根的名字是一个特殊的绝对路径名,它不包含文件名。
#include "apue.h" #include <dirent.h> int main(int argc, char *argv[]) { DIR *dp; struct dirent *dirp; if (argc != 2) { err_quit("Usage: is directory_name"); } if ((dp = opendir(argv[1])) == NULL) { err_sys("Can not open %s\n",argv[1]); } while ((dirp = readdir(dp)) != NULL) { printf("%s\n",dirp->d_name); } }
4、工作目录:
每一个进程都有一个工作目录(working directory),有时也称为当前工作目录(current working directory)。所以相对路径名都从工作目录开始解释。进程可以用chdir函数更改工作目录。
输入输出
1、文件描述符(file descriptor):
通常是一个小的非负整数,内核用以表示一个特定进程正在访问的文件。当内核打开一个现有文件或者创建一个新文件时,它都返回一个文件描述符。在读、写文件时,可以使用这个文件描述符。
2、标准输入、标准输出和标准错误:
按照惯例,每当运行一个新程序时,所有的shell都为其打开三个文件描述符,既标准输入(standard input)、标准输出(standard output)以及标准错误(standard error)。
3、不带缓冲的IO:
函数open、read、write、lseek以及close提供了不带缓冲的I/O。这些函数都使用文件描述符。
#include "apue.h" #define BUFFERSIZE 4096 int main(void) { int n; char buf[BUFFERSIZE]; while (n = read(STDIN_FILENO, buf, BUFFERSIZE) > 0) { if (write(STDOUT_FILENO, buf, n) != n) { err_sys("write error"); } } if (n < 0) { err_sys("read error"); } exit(0); }
4、标准I/O
标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无须担心如何选取最佳的缓冲区大小。使用标准I/O函数还能建行对输入行的处理。例如,fgets函数读取一个完成的行,而read函数读取指定字节数。
函数fgetc一次读取一个字符,然后函数putc将此字符写到标准输出。读到输入的最后一个字节时,getc返回常量EOF。
程序和进程
1、程序:
程序是一个存储在磁盘上某个目录的可执行文件。内核使用exec函数将程序读入内存并执行程序。
2、进程和进程ID:
程序的执行实例称为进程(process)。某些操作系统用任务(task)来表示正在被执行的程序。
UNIX系统确保每一个进程都有一个唯一的数字标识符,称为进程ID(process ID)。进程ID总是一个非负整数。
#include "apue.h" int main(void) { printf("hello world from process ID %ld\n", (long)getpid()); exit(0); }
3、进程控制:
有三个用于进程控制的主要函数:fork、exec和waitpid。(exec函数有7中变体,但经常把它们统称为exec函数。)
//TODO
4、线程和线程ID:
一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与集成相关的属性。因为它们能访问同一存储区,所以各线程在访问共享数据时需要采取同步措施以避免不一致性。
与进程相同,线程也用ID标识。但是,线程ID只在它所属的进程内起作用。一个进程中的线程ID只在它所属的进程中起作用。一个进程中的线程ID在另一个进程中没有意义。在一个进程中对某个特定的线程进行处理时,我么可以使用该线程的ID引用它。
时间值:
UNIX系统有两种不同的时间值。
1、日历时间: 该值是自协调世界时1970年1月1日00:00:00这个特定时间以来所经过的秒数累计值。这些时间值可用于记录文件最近一次的修改时间。
系统基本数据类型time_t用于保存这种时间值。
2、进程时间:也被称为CPU时间,用以度量进程使用的中央处理器资源。进程事件以时钟滴答计算。
系统基本数据类型clock_t保存这种时间值。