UNIX基本知识

我们可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境;我们通常将这种软件称为内核

内核的接口被称为系统调用;

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

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

登陆

查看系统的登录名:/etc/passwd 文件

口令文件中的登陆项由七个冒号分隔的字段组成,依次是:

登录名、加密口令、数字用户ID、数字组ID、注释字段、起始目录、以及shell程序。

shell

shell是一个命令行解释器,它读取用户输入,然后执行命令。

文件名

在文件名中,只有斜线/和空字符这两个字符不能出现在文件名中。这是因为斜线用来分隔构成路径名的各个文件名,空字符则用来终止一个路径名。

当创建新目录时会自动创建两个文件名:. 和 .. 一个指向当前目录,另一个指向父目录。在最高层次的根目录中,点点和点相同。

路径名

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

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

相对路径名指向相对与当前目录的文件。

文件描述符

文件描述符通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当内核打开一个现有文件或者创建一个新文件时,它都会返回一个文件描述符。

标准输入、标准输出和标准错误

按惯例,每当运行一个新程序时,所有的shell都为其打开3个文件描述符,即标准输入、标准输出以及标准错误。如果不做特殊处理,则这3个描述符都链接向终端。但大多数shell都提供一种方法,使其中任何一个或所有这3个描述符都能重定向到某个文件,例如

ls > file.txt

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

不带缓冲的I/O

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

程序

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

进程和进程ID

程序的执行实例被称为进程,UNIX系统确保每一个进程都有一个唯一的数字标识符,称为进程ID。进程ID总是一个非负整数。

线程和线程ID

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

一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。

同时,因为它们能访问同一存储区,所以各线程在访问共享数据时需要采取同步措施以避免不一致性。

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

出错处理

当UNIX系统函数出错时,通常会返回一个负值,而且整型变量errno通常被设置为具有特定信息的值。

文件<errno.h>中定义了errno以及可以赋予它的各种常量。

errno应当注意两条规则。

第一条规则是:如果没有出错,其值不会被例程清除。因此,仅当函数的返回值指明出错时,才检验其值。

第二条规则是:任何函数都不会将errno值设置为0,而且在<errno.h>中定义的所有常量都不为0。

C标准定义了两个函数,它们用于打印出错信息

#include <string.h>
char *strerror(int errnum);

strerror函数将errnum映射为一个出错消息字符串,并且返回次字符串的指针。

#include <stdio.h>
void perror(const char *msg);

perrir函数基于error的当前值,在标准错误上产生一条出错消息,然后返回。它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应与errno值的出错消息,最后是一个换行符。

用户标识

用户ID

口令文件登陆项中的用户ID是一个数值,它向系统标识各个不同的用户。

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

组ID

口令文件登陆项也包括用户的组ID,它是一个数值。组ID也是由系统管理员在指定用户登录名时分配的。

附属组ID

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

信号

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

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

1.忽略信号

2.按系统默认方法处理

3.提供一个函数,信号发生时调用该函数,这杯称为捕捉该信号。

 终端键盘上有两种产生信号的方法,分别称为终端键(通常是Delete键或Ctrl + C)和退出键(通常是Ctrl + \),它们被用于中断当前运行的进程。

还有一种产生信号的方法是调用kill函数,在一进程中调用此函数就可向另一个进程发送一个信号。当然这样做也有些限制:当向一个进程发送信号时,我们必须是那个进程的所有者或者是超级用户。

时间值

历史上,UNIX系统使用过两种不同的时间值。

1.日历时间:该值是UTC ,1970年1月1日 00:00:00 这个特定时间以来所经过的秒数累计值。系统基本数据类型time_t用于保存这种时间值。

2.进程时间:也被称为CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟滴答计算。系统基本数据类型clock_t保存这种时间值。

当度量一个进程的执行时间时,UNIX系统为一个进程维护了3个进程时间值:

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

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

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

系统调用和库函数

系统调用接口在《UNIX程序员手册》的第2部分中说明,是用C语言定义的,与具体系统如何调用一个系统调用的实现技术无关。

《UNIX程序员手册》第3部分定义了程序员可以使用的通用函数库。虽然这些函数可能会调用一个或多个内核的系统调用,但是它们并不是内核的入口点。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值