p r i n t e r
$ a.out /var/spool/mqueue
can't open /var/spool/mqueue:Permission denied
$ a.out /dev/tty
can't open /dev/tty:Not a directory
本书将以这种方式表示输入的命令以及其输出:输入的字符以粗体表示,程序输出则以另
一种字体表示。如果欲对输出添加注释,则以中文宋体表示,输入之前的美元符号 ( $ )是s h e l l打
印的提示符,本书将s h e l l提示符显示为$。
注意,列出的目录项不是以字母顺序排列的, l s命令则一般按字母顺序列出目录项。
在这2 0行的程序中,有很多细节需要考虑:
• 首先,其中包含了一个头文件o u r h d r. h。本书中几乎每一个程序都包含此头文件。它包含
了某些标准系统头文件,定义了许多常数及函数原型,这些都将用于本书的各个实例中,附录
B列出了常用头文件。
• main函数的说明使用了ANSI C标准所支持的新风格(下一章将对ANSI C作更多说明)。
• 取命令行的第1个参数a rg v〔1〕作为列出的目录名。第 7章将说明m a i n函数如何被调用,
程序如何存取命令行参数和环境变量。
• 因为各种不同U N I X系统的目录项的实际格式是不一样的,所以使用函数 o p e n d i r, readdir
和c l o s e d i r处理目录。
• opendir函数返回指向D I R 结构的指针,并将该指针传向 r e a d d i r函数。我们并不关心 D I R
结构中包含了什么。然后,在循环中调用 r e a d d i r 来读每个目录项。它返回一个指向 d i r e n t 结
构的指针,而当目录中已无目录项可读时则返回 n u l l 指针。在 d i r e n t结构中取出的只是每个
目录项的名字 ( d _ n a m e ) 。使用该名字,此后就可调用 s t a t函数(见4 . 2 节)以决定该文件的所有
属性。
• 调用了两个自编的函数来对错误进行处理:e r r _ s y s和e r r _ q u i t。从上面的输出中可以看到,
e r r _ s y s 函数打印一条消息(“Permission denied(许可权拒绝)”或“Not a directory(不是一个目
录)”),说明遇到了什么类型的错误。这两个出错处理函数在附录 B中说明,1 . 7节将更多地叙
述出错处理。这两个出错处理函数在附录 B中说明1 . 7节将更详细地叙述出错处理。
• 当程序将结束时,它以参数 0调用函数e x i t 。函数e x i t终止程序。按惯例,参数0的意思是
正常结束,参数值1~2 5 5 则表示出错。8 . 5 节将说明一个程序(例如s h e l l或我们所编写的程序)如
何获得它所执行的另一个程序的e x i t状态。
1.3.4 工作目录
每个进程都有一个工作目录 (working directory,有时称为当前工作目录 (current working
d i r e c t o r y ) )。所有相对路径名都从工作目录开始解释。进程可以用 c h d i r函数更改其工作目录。
例如,相对路径名d o c / m e m o / j o e指的是文件j o e,它在目录m e m o 中,而m e m o又在目录d o c
中,d o c 则应是工作目录中的一个目录项。从该路径名可以看出, d o c 和m e m o 都应当是目录,
但是却不清楚j o e 是文件还是目录。路径名 / u r s / l i b / l i n t 是一个绝对路径名,它指的是文件 (或目
录) lint,而l i n t在目录l i b中,l i b则在目录u s r中,u s r则在根目录中。
1.3.5 起始目录
登录时,工作目录设置为起始目录(home directory),该起始目录从口令文件(见1 . 2节)中
4 U N I X 环境高级编程
评论0
最新资源