UNIX基础知识

​1.1  引言

所有操作系统都为它们所运行的程序提供服务。典型的服务包括:执行新程序、打开文件、读文件、分配存储区以及获得当前时间等,本书集中阐述不同版本的UNIX操作系统所提供的服务。

想要按严格的先后顺序介绍UNIX,而不超前引用尚未介绍过的术语,这几乎是不可能的(可能也会令人厌烦)。本章从程序员的角度快速浏览UNIX,对书中引用的一些术语和概念进行简要的说明并给出实例。在以后各章中,将对这些概念做更详细的说明。对于初涉UNIX环境的程序员,本章还简要介绍了UNIX提供的各种服务。

1.2  UNIX体系结构

从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kernel),因为它相对较小,而且位于环境的核心。图1-1显示了UNIX系统的体系结构。

内核的接口被称为系统调用(system call,图1-1

中的阴影部分)。公用函数库构建在系统调用接口之上,应用程序既可使用公用函数库,也可使用系统调用。(我们将在1.11节对系统调用和库函数做更多说明。)shell是一个特殊的应用程序,为运行其他应用程序提供了一个接口。


从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特性。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等。

例如,Linux是GNU操作系统使用的内核。一些人将这种操作系统称为GNU/Linux操作系统,但是,更常见的是简单地称其为Linux。虽然这种表达方法在严格意义上讲并不正确,但鉴于“操作系统”这个词的双重含义,这种叫法还是可以理解的(这样的叫法更简洁)。

1.3  登录

1.登录名

用户在登录UNIX系统时,先键入登录名,然后键入口令。系统在其口令文件(通常是/etc/ passwd文件)中查看登录名。口令文件中的登录项由7个以冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID(205)、数字组ID(105)、注释字段、起始目录(/home/sar)以及shell程序(/bin/ksh)。


sar:x:205:105:StephenRago:/home/sar:/bin/ksh


目前,所有的系统已将加密口令移到另一个文件中。第6章将说明这种文件以及访问它们的函数。


2.shell

用户登录后,系统通常先显示一些系统信息,然后用户就可以向shell程序键入命令。(当用户登录时,某些系统启动一个视窗管理程序,但最终总会有一个shell程序运行在一个视窗中)。shell是一个命令行解释器,它读取用户输入,然后执行命令。shell的用户输入通常来自于终端(交互式shell),有时则来自于文件(称为shell脚本)。图1-2总结了UNIX系统中常见的shell。


系统从口令文件中相应用户登录项的最后一个字段中了解到应该为该登录用户执行哪一个shell。图1-2 UNIX系统中常见的shell

自V7以来,由Steve Bourne在贝尔实验室开发的Bourne shell得到了广泛应用,几乎每一个现有的UNIX系统都提供Bourne shell,其控制流结构类似于Algol 68。


C shell是由Bill Joy在伯克利开发的,所有BSD版本都提供这种shell。另外,AT&T的System V/386 R3.2和System V R4(SVR4)也提供C shell(下一章将对这些不同版本的UNIX系统做更多说明)。C shell是在第6版shell而非Bourne shell的基础上构造的,其控制流类似于C语言,它支持Bourne shell没有的一些特色功能,例如作业控制、历史机制以及命令行编辑等。


Korn shell是Bourne shell的后继者,它首先在SVR4中提供。Korn shell是由贝尔实验室的David Korn开发的,在大多数UNIX系统上运行,但在SVR4之前,通常它需要另行购买,所以没有其他两种shell流行。它与Bourne shell向上兼容,并具有使C shell广泛得到应用的一些特色功能,包括作业控制以及命令行编辑等。


Bourne-again shell是GNU shell,所有Linux系统都提供这种shell。它的设计遵循POSIX标准,同时也保留了与Bourne shell的兼容性。它支持C shell和Korn shell两者的特色      功能。

TENEX C shell是C shell的加强版本。它从TENEX操作系统(1972年BBN公司开发)借鉴了很多特色,例如命令完备。TENEX C shell在C shell基础上增加了很多特性,常被用来替换C shell。


POSIX 1003.2标准对shell进行了标准化。这项规范基于Korn shell和Bourne shell的特性。


不同的Linux系统使用不同的默认shell。一些Linux默认使用Bourne-again shell。另外一些使用BSD的对Bourne shell的替代品dash(Debian Almquistshell,最早由KennethAlmquist开发,并在后来移植入Linux)。FreeBSD的默认用户shell衍生于Almquist shell。Mac OS X的默认shell是Bourne-again shell。


Solaries继承了BSD和System V两者,它提供了图1-2中所示的所有shell。在因特网上可以找到shell的自由移植版软件。


本书将使用这种形式的注释来描述历史注释,并对不同的UNIX系统的实现进行比较。当我们了解到历史缘由后,会更好地理解采用某种特定实现技术的原因。


本书将使用很多交互式shell实例来执行所开发的程序,这些实例使用了Bourne shell、Korn shell和Bourne-again shell通用的功能。

1.4  文件和目录

1.文件系统

UNIX文件系统是目录和文件的一种层次结构,所有东西的起点是称为根(root)的目录,这个目录的名称是一个字符“/”。


目录(directory)是一个包含目录项的文件。在逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。文件属性是指文件类型(是普通文件还是目录等)、文件大小、文件所有者、文件权限(其他用户能否访问该文件)以及文件最后的修改时间等。stat和fstat函数返回包含所有文件属性的一个信息结构。第4章将详细说明文件的各种属性。


目录项的逻辑视图与实际存放在磁盘上的方式是不同的。UNIX文件系统的大多数实现并不在目录项中存放属性,这是因为当一个文件具有多个硬链接时,很难保持多个属性副本之间的同步。这一点将在第4章讨论硬链接时理解得更明晰。

2.文件名

目录中的各个名字称为文件名(filename)。只有斜线(/)和空字符这两个字符不能出现在文件名中。斜线用来分隔构成路径名的各文件名,空字符则用来终止一个路径名。尽管如此,好的习惯还是只使用常用印刷字符的一个子集作为文件名字符(如果在文件名中使用了某些shell的特殊字符,则必须使用shell的引号机制来引用文件名,这会带来很多麻烦)。事实上,为了可移植性,POSIX.1推荐将文件名限制在以下字符集之内:字母(a~z、A~Z)、数字(0~9)、句点(.)、短横线(-)和下划线(_)。


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


Research UNIX System和某些早期UNIX System V的文件系统限制文件名的最大长度为14个字符,BSD版本则将这种限制扩展为255个字符。现今,几乎所有商业化的UNIX文件系统都支持超过255个字符的文件名。

3.路径名

由斜线分隔的一个或多个文件名组成的序列(也可以斜线开头)构成路径名(pathname),以斜线开头的路径名称为绝对路径名(absolute pathname),否则称为相对路径名(relative pathname)。相对路径名指向相对于当前目录的文件。文件系统根的名字(/)是一个特殊的绝对路径名,它不包含文件名。


实例不难列出一个目录中所有文件的名字,

图1-3是ls(1)命令的简要实现。

#include"apue.h"

#include<dirent.h>

int

main(int argc, char*argv[])

{

   DIR                *dp;

   struct dirent    *dirp;

   if (argc != 2)

        err_quit("usage: lsdirectory_name");

   if((dp = opendir(argv[1])) == NULL)

        err_sys("can't open %s", argv[1]);

   while ((dirp = readdir(dp)) != NULL)

        printf("%s\n",dirp->d_name);

   closedir(dp);

   exit(0);

}



ls(1)这种表示方法是UNIX系统的惯用方法,用以引用UNIX系统手册中的一个特定项。ls(1)引用第一部分中的ls项。各部分通常用数字1~8编号,在每个部分中的各项则按字母顺序排列。在本书中始终假定你有自己所使用的UNIX系统的手册。


早期的UNIX系统把8个部分都集中在一本《UNIX程序员手册》(UNIXProgrammer’sManual)中。随着页数的增加,现在的趋势是把这些部分分别安排在不同的手册中,例如用户手册、程序员手册以及系统管理员手册等。


一些UNIX系统用大写字母把某一部分手册进一步分成若干小部分,例如,AT&T[1990e]中的所有标准I/O函数都被指明位于3S部分中,例如fopen(3S)。另一些UNIX系统不用数字而是用字母将手册分成若干部分,如用C表示命令部分等。


现今,大多数手册都以电子文档形式提供。如果用的是联机手册,则可用下面的命令查看ls命令手册页:


man 1 ls



man -s1 ls


图1-3只打印一个目录中各个文件的名字,不显示其他信息,如果该源文件名为myls.c,则可以用下面的命令对其进行编译,编译结果是生成默认名为a.out的可执行文件中。


cc myls.c


历史上,cc(1)是C编译器。在配置了GNU C编译系统的系统中,C编译器是gcc(1)。其中,cc通常链接至gcc。


示例输出如下:


$ ./a.out /dev

.

..

cdrom

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值