《unix高级环境编程》读书摘记系列之1——Unix基础知识

Unix基础知识

一、Unix体系结构

Os控制计算机硬件资源,提供程序运行环境,一般称其为内核,其相对较小,位于环境的中心。

内核的接口称为系统调用(system call);公用函数库构建在系统调用接口之上;应用软件即可使用公用函数库,也可使用系统调用。Shell是一种特殊的应用程序,其为运行其它应用程序提供了一个接口。

二、登录

1.登录名

系统在其口令文件(/etc/passwd)中查看登录名。口令文件中登录项由7个以冒号分隔的字段组成,如:

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

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

2Shell

Shell

路径

描述

Bourne shell

/bin/sh

几乎每一个现有的Unix系统都提供Bourne shell

Bourne-again shell

/bin/bash

其是GNU shell,所有Linux系统都提供这种shell

C shell

/bin/csh

在第6shell而非Bourne shell基础上构造。

Korn shell

/bin/ksh

Bourne shell的后继者,它首先在SVR4中提供

TENEX C shell

/bin/tcsh

C shell的加强版,在c shell的基础上增加了很多特征,常被用来替换c shell

三、文件和目录

1.文件系统

Unix文件系统是目录与文件组成的一种层次结构,目录的起点称为根(root),其名字是一个字符/。目录是一个包含许多目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。文件属性指文件类型、文件大小、文件所有者、文件权限以及文件最后的修改时间等等。

2.文件名

目录中的各个名字称为文件名;不能出现在文件名中的字符只有斜线(/)和空操作符(null)。斜线用来分隔构成路径名的各文件名,空操作符用来终止一个路径名。创建新目录时会自动创建两个文件名:....指当前目录,..指父目录;在最高层次的根目录中...相同。几乎所有商品化的Unix系统都支持至少255个字符的文件名。

3.路径名

一个或多个以斜线分隔的文件名序列构成路径名,以斜线开头的路径名称为绝对路径名,否则称为相对路径名。

4.工作目录

每个进程都有一个工作目录,有时称为当前工作目录,所有相对路径名都从工作目录开始解释。

5.起始目录

登录时,工作目录设置为起始目录(/home/sar),该起始目录从口令文件中相应用户的登录项中取得。

四、输入和输出

1.文件描述符

文件描述符通常是一个小的非负整数,内核用其标识一个特定进程正在访问的文件。当内核打开一个已有文件或创建一个新文件时,它返回一个文件描述符。则在读、写文件时就可使用它。

2.标准输入、标准输出和标准出错

当运行一个新程序时,所有shell都为其打开三个文件描述符:标准输入(STDIN_FILENO,0)、标准输出(STDOUT_FILENO,1)和标准出错(STDERR_FILENO,2)

3.不用缓冲的I/O

函数openreadwritelseek以及close提供了不用缓冲的I/O,这些函数都是用文件描述符。

4.标准I/O

标准I/O函数库提供了使我们能够控制该库所使用的缓冲风格的函数。标准I/O函数提供一种对不用缓冲I/O函数的带缓冲的接口,使用标准I/O函数无需担心如何选取最佳缓冲区大小,标准I/O函数都放在<stdio.h>中。

五、程序和进程

1.程序

程序是存放在磁盘上、处于某个目录中的一个可执行文件。可使用6exec函数中一个由内核载入存储器并使其执行之。

2.进程和进程ID

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

3.进程控制

有三个用于进程控制的主要函数:forkexecwaitpidExec函数有6种变体,但常统称它们为exec函数。

4.线程和线程ID

一个进程只有一个控制线程,同一时刻只执行一组机器指令。在一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。从而各线程在访问共享数据时需要采取同步措施以避免不一致性。与进程相同,线程也用ID标识;但线程ID只在它所属进程内起作用。

六、出错处理

C标准定义了两个函数帮助打印出错信息。

#include <string.h>  Char *strerror(int errnum);   返回值:指向消息字符串的指针

该函数将errnum映射为一个出错信息字符串,并返回此字符串的指针。

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

该函数基于errno的当前值,在标准出错上产生一条处所信息,其首先输出由msg指向的字符串,然后一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。

七、用户标识

1.用户ID

口令文件登录项中的用户ID是个数值,它向系统标识各个不同的用户。系统管理员在确定一个用户的登录名的同时,确定其用户ID;用户不能更改其用户ID;每个用户都有一个唯一的用户ID。用户ID0的用户为根或超级用户,超级用户对系统有自由的支配权。

2.组ID

口令文件登录项也包括用户的组ID,其是一个数值。组ID也是由系统管理员在指定用户登录名时分配的;一般在口令文件中有多个记录项具有相同的组ID。组被用于将若干用户分到不用的项目组或部门中去。这种机制允许同组各成员间共享资源

八、信号

信号是通知进程已发生某种情况的一种技术。进程如何处理信号有三种选择:

(1)    忽略此信号

(2)    按系统默认方式处理,如除0操作,系统默认方式是终止该进程。

(3)    提供一个函数,信号发生时则调用该函数,这被称为捕捉该信号;只要提供自编的函数就能知道什么时候产生了该信号,并按所希望的方式处理它。

产生信号有多种:

(1)    中断键(delete/ctrl+c)或退出键(ctrl+/),被用于中断当前运行的进程。

(2)    调用名为kill的函数。在一个进程中调用此函数就可向另一个进程发送一个信号。

九、时间值

Unix系统一直使用两种不同的时间值:

(1)    日历时间:自19701100:00:00以来国际标准时间所经过的秒数累计值。这些时间可用于记录文件最近一次的修改时间。系统用time_t来保存这种时间值。

(2)    进程时间:用以度量进程使用的cpu资源,系统用clock_t来保存这种时间值。

Unix系统使用三个进程时间值来度量一个进程的执行时间:

1.       时钟时间(real):进程运行的时间总量。

2.       用户cpu时间(user):执行用户指令(包括内核程序)时所耗时间。

3.       系统cpu时间(sys):进程执行内核程序所用时间。

用户cpu时间和系统cpu时间之和常被称为cpu时间。 (real>sys>user)

十、系统调用和库函数

应用程序调用系统调用或者库函数,而很多库函数则调用系统调用.

系统调用和库函数之间的另一个差别是:系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值