UNIX基础知识(unix简介及优缺点)

2023-07-30 20:00:36 阅读:

 

1、UNIX体系结构

严格意义上,可将操作系统看成一种软件,它控制着计算机硬件资源,提供程序运行环境。

因其相对较小,而且位于环境的核心。称其为内核(kernel)。

系统调用(system calls):内核的接口

shell:特殊的应用程序,为运行其他应用程序提供了一个接口。

公用函数库构建在系统调用接口之上,应用程序既可使用公用函数库,也可使用系统调用。

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

二、登录

1、用户在登录UNIX系统时,先键入登录名,再键入口令。系统在其口令文件(通常是/etc/passwd文件)中查看登录名。口令文件中的登录项由7个以冒号分割的字段组成。

登录名:加密口令:数字用户ID(205):数字组ID(105):注释字段:起始目录:shell程序

sar:x:205:105:Stephen Rago:/home/sar:/bin/ksh

三、文件和目录

1、文件系统

UNIX文件系统是目录和文件的一种层次结构,所有东西的起点是称为根root的目录,其名称就是一个字符‘/’。

目录是一个包含目录项的文件。在逻辑上,可认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。文件属性(文件类型、文件大小、文件所有者、文件权限、文件最后修改的时间)。用stat和fstat函数返回包含所有文件属性的一个信息结构。

2、文件名

不能包含空格和斜线(/),斜线用来分割构成路径名的各文件名,空字符用来终止一个路径名。

文件名组成:字母,数字,句点(.),短横线(-),下划线(_)

创建新目录时会自动创建两个文件名:

.(点):指向当前目录

..(点点):指向父目录

根目录中,点和点点相同

3、路径名

由斜线分隔得一个或多个文件名组成的序列构成路径名。

相对路径:相对于当前目录的文件。

绝对路径:以斜线开头的路径名称。

4、ls命令的简要实现

//myls.c

dirent.h文件中包含opendir和readdir的函数原型,以及dirent的结构定义.

cc myls.c //编译

编译结果是生成默认名为a.out的可执行文件中

$ ./a.out /dev //输出dev目录下的文件名

5、工作目录

每个进程都有一个工作目录,进程可以用chdir函数更改其工作目录。

相对路径名doc/memo/joe是指当前目录中的doc目录中的memo目录中的文件joe

路径名/urs/lib/lint是一个绝对路径名,指根目录中的usr目录中的lib目录中的文件lint

四、输入输出

1、文件描述符

通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。

2、标准输入,标准输出,标准错误

每当运行一个新程序时,所有的shell都为其打开3个文件描述符标准输入(standard input),标准输出(standard output),标准错误(stardard error),都链接向终端。

大多数shell都提供了一种方法,使其中一个或所有这3个描述符都能重新定向到某个文件。

ls > file.list

执行ls命令,其标准输出重新定向到名为file.list的文件。

3、不带缓存的I/O

函数open、read、write、lseek、close提供了不带缓存的I/O。

//复制任一UNIX普通文件(从标准输入读,向标准输出写) #include <unistd.h> //包含了<unistd.h> //<unistd.h>中包含read和write #define BUFFSIZE 4096 int main() { int n; char buf[BUFFSIZE]; while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0){ //若发生错误,read返回-1 if(write(STDOUT_FILENO,buf,n)!=n) err_sys("write error"); } if(n<0) err_sys("read error"); exit(0); }

五、程序和进程

1、程序是一个存储在磁盘上某个目录中的可执行文件。内核使用exec函数将程序读入内存,并执行程序。

程序的执行实例被称为进程,有些操作系统也用任务表示正在执行的程序。

2、程序ID:一个非负整数,进程的唯一标识符

#include <stdio.h>#include <process.h>//打印进程id int main(){ printf("hello world from process ID:%ld\n",(long)getpid()); } //长整形提高可移植性

3、进程控制:

三个主要函数:fork、exec、waitpid。

4、线程和线程ID

通常,一个进程只有一个控制线程(thread)——某一时刻执行的一组机器指令。对某些问题,多个控制线程分别作用于它的不同部分,问题解决就容易的多,另外,多个控制线程也可以充分利用多处理器系统的并行能力。

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

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

控制线程的函数与控制进程的函数类似,但另有一套。

5、出错控制

当UNIX系统函数出错时,通常会返回一个负值,整型变量errno通常被设置为具有特定信息的值。有大约15种不同的error的值(权限问题,文件不存在)

<errno.h>定义了errno以及可以赋予它的各种常量(都以E开头)。

POSIX和ISO C将errno定义为一个符号,将其拓展为可修改的左值。可以是一个包含出错编号的整数,也可是一个返回出错编号指针的函数。

以前定义:

extern int errno;

Linux支持多线程存取errno,其定义为:

extern int *__errno_location(void); #define errno (__errno_location())

对errno应注意:

1、若没有出错,其值不会被例程清除。所以仅当函数的返回值指明出错时,才检验其值。

2、任何函数都不会将errno值设置为0.

六、用户标识

1.用户ID

口令文件登录项中的用户ID是一个数值,向系统标识各个不同的用户。系统管理员在确定一个用户的登录名的同时,确定其用户ID。用户不能修改其用户ID。通常每个用户都有其唯一的用户ID。

用户ID为0的用户为根用户或超级用户,在口令文件中,有个登录项,其登录名为root,即超级用户,超级用户对系统有自由的支配权。

2、组ID

口令文件登录项也包括用户的组ID,是一个数值。组ID也是由系统管理员在指定用户登录名时分配的。允许同组的各个成员之间共享资源。组文件将组名映射为数值的组ID。组文件通常是/etc/group.

3、附属组ID

除在口令文件中对一个登录名指定一个组ID外,大多数UNIX系统版本还允许一个用户属于另外一些组。允许一个用户属于至多16个其他的组

七、信号

信号signal用于通知进程发生了某种情况。

进程有3种处理信号的方式:

1、忽略信号。有些信号表示硬件异常,例如:除以0或访问进程地址空间以外的存储单元等,因为这些异常产生的后果不确定,所以不推荐这种处理方式。

2、按系统的默认方法处理。对于除数0,系统默认终止该进程。

3、提供一个函数,信号发生时调用该函数,被称为捕捉该信号。通过自己编写的函数,我们就能知道什么时候产生了信号,并按期望的方式去处理它。

终端键盘产生信号的方式:

1、中断键(interrupt key):通常是Delete键或Ctrl+C

2、退出键(quit key)通常是Ctrl+\

它们被用于中断当前运行的进程。

调用kill函数也可产生信号。

在一个进程中调用此函数就可向另一个进程发送一个信号。

八、时间值

UNIX系统使用过两种不同的时间值。

1、日历时间。该值是自协调世界时(Coordinated Universal Time,UTC)1970年1月1日00:00:00这个特定时间以来所经历的秒数累计值。这些时间值可用于记录文件最近一次修改的时间。

系统基本数据类型time_t用于保存这种时间值.

2、进程时间。即CPU时间,用以度量进程使用的中央处理器资源。进程时间以滴答计算。每秒钟曾取为50,60,100个时间滴答。

系统基本数据类型clock_t用于保存这种时间值.

UNIX系统为一个进程维护了3个进程时间值:

1、时钟时间。又称墙上时钟时间(wall clock time),进程进行的时间总量,其值与系统中同时运行的进程数有关。

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

3、系统CPU时间。为该进程执行内核程序所经历的时间。

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

time:得到任一进程的时钟时间,用户时间,系统时间。

九、系统调用和库函数

1、从实现者角度看,系统调用和库函数有明显区别。系统调用通常是不能被替换的,库函数可由我们自己编写实现。

2、从用户角度看,区别并不重要,系统调用和库函数 都以C函数的形式出现,两者都为应用程序提供服务。

3、从职责来看,内核中的系统调用分配一块空间给进程,而库函数malloc则在用户这一层次管理这一空间。

4、系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。如:sbrk系统调用和malloc库函数之间的差异。

问题:

1、目录.和..除根目录外是不同的

-i用于打印文件或目录的i节点标号,-d用于打印目录信息。可见第二个命令打印出来的i节点编号都为2.是一样的。


以上就是关于《UNIX基础知识(unix简介及优缺点)》的全部内容,本文网址:https://www.7ca.cn/tg/42447.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明