Unix环境高级编程002.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Unix环境高级编程002.pdf》由会员分享,可在线阅读,更多相关《Unix环境高级编程002.pdf(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、i o c t l函数不是P O S I X.1的一部分,但是,S V R 4和4.3+B S D用其进行很多杂项设备操作。我们所示的原型是S V R 4和4.3+B S D所使用的,而较早的伯克利系统则将第二个参数说明为unsigned long。因为第二个参数总是一个头文件中的#d e f i n e名称,所以这种细节并没有什么影响。对于ANSI C原型,它用省略号表示其余参数。但是,通常另外只有一个参数,它常常是指向一个变量或结构的指针。在此原型中,我们表示的只是i o c t l函数本身所要求的头文件。通常,还要求另外的设备专用头文件。例如,除P O S I X.1所说明的基本操作之外
2、,终端i o c t l都需要头文件。目前,i o c t l的主要用途是什么呢?我们将4.3+B S D的i o c t l操作分类示于表3-4中。表3-4 4.3+BSD ioctl操作类型常数名头文件ioctl 数盘标号D I O x x x1 0文件I/OF I O x x x7磁带I/OM T I O x x x4套接口I/OS I O x x x2 5终端I/OT I O x x x3 5磁带操作使我们可以在磁带上写一个文件结束标志,反绕磁带,越过指定个数的文件或记录等等,用本章中的其他函数(r e a d、w r i t e、l s e e k等)都难于表示这些操作,所以,用 i
3、 o c t l是对这些设备进行操作的最容易的方法。在11.1 2节中存取和设置终端窗口,1 2.4节中说明流系统时,以及1 9.7节中述及伪终端的高级功能时,都将使用i o c t l。3.15 /dev/fd比较新的系统都提供名为/d e v/f d的目录,其目录项是名为 0、1、2等的文件。打开文件/d e v/f d/n等效于复制描述符n(假定描述符n是打开的)。/d e v/f d这种特征由Tom Duff开发,它首先出现在Research UNIX System的第8版中,S V R 4和4.3+B S D支持这种特征。它不是P O S I X.1的组成部分。在函数中调用:fd=o
4、pen(/dev/fd/0,mode);大多数系统忽略所指定的 m o d e,而另外一些则要求 m o d e是所涉及的文件(在这里则是标准输入)原先打开时所使用的m o d e的子集。因为上面的打开等效于:fd=dup(0);描述符0和f d共享同一文件表项(见图3-3)。例如,若描述符0被只读打开,那么我们也只对f d进行读操作。即使系统忽略打开方式,并且下列调用成功:fd=open(/dev/fd/0,O_RDWR);我们仍然不能对f d进行写操作。第3章文 件 I/O 5 1下载我们也可以用/d e v/f d作为路径名参数调用c r e a t,或调用o p e n,并同时指定O
5、_ C R E AT。这就允许调用c r e a t的程序,如果路径名参数是/d e v/f d/1等仍能工作。某些系统提供路径名/d e v/s t d i n,/d e v/s t d o u t和/d e v/s t d e r r。这些等效于/d e v/f d/0,/d e v/f d/1和/d e v/f d/2。/d e v/f d文件主要由s h e l l使用,这允许程序以对待其他路径名一样的方式使用路径名参数来处理标准输入和标准输出。例如,c a t(1)程序将命令行中的一个单独的-特别解释为一个输入文件名,该文件指的是标准输入。例如:filter file2|cat fi
6、le1-file3|lpr首先c a t读f i l e 1,接着读其标准输入(也就是filter file2命令的输出),然后读f i l e 3,如若支持/d e v/f d,则可以删除c a t对-的特殊处理,于是我们就可键入下列命令行:filter file2|cat file1/dev/fd/0 file3|lpr在命令行中用-作为一个参数特指标准输入或标准输出已由很多程序采用。但是这会带来一些问题,例如若用-指定第一个文件,那么它看来就像开始了另一个命令行的选择项。/d e v/f d则提高了文件名参数的一致性,也更加清晰。3.16 小结本章说明了传统的UNIX I/O函数。因为每
7、个read,write都因调用系统调用而进入内核,所以称这些函数为不带缓存的 I/O函数。在只使用r e a d和w r i t e情况下,我们观察了不同的I/O长度对读文件所需时间的影响。在说明多个进程对同一文件进行添加操作以及多个进程创建同一文件时,本章介绍了原子操作。也介绍了内核用来共享打开文件信息的数据结构。在本书的稍后部分还将涉及这些数据结构。我们还介绍了i o c t l和f c n t l函数。第1 2章还将使用这两个函数,将 i o c t l用于流I/O系统,将f c n t l用于记录锁。习题3.1在当读/写磁盘文件时,本章中描述的函数是否有缓存机制?请说明原因。3.2在编
8、写一个同3.1 2节中的d u p 2功能相同的函数,要求不调用 f c n t l函数并且要有正确的出错处理。3.3在假设一个进程执行下面的3个函数调用:fd1=open(pathname,oflags);fd2=dup(fd1);fd3=open(pathname,oflags);画出结果图(见图 3-3)。对f c n t l作用于f d 1来说,F _ S E T F D命令会影响哪一个文件描述符?F _ S E T F L呢?3.4在在许多程序中都包含下面一段代码:dup2(fd,0);dup2(fd,1);dup2(fd,2);if(fd 2)5 2U N I X环境高级编程下载c
9、 l o s e(f d);为了说明i f语句的必要性,假设f d是1,画出每次调用d u p 2时3个描述符项及相应的文件表项的变化情况。然后再画出f d为3的情况。3.5在在Bourne shell和K o r n S h e l l中,d i g i t1&d i g i t2表示要将描述符 d i g i t1重定向至描述符d i g i t2的同一文件。请说明下面两条命令的区别。a.out outfile 2&1a.out 2&1 outfile(提示:s h e l l从左到右处理命令行。)3.6在如启用添加标志打开一文件以便读、写,能否用l s e e k在任一位置开始读?能否用
10、l s e e k更新文件中任一部分的数据?请写一段程序以验证之。第3章文 件 I/O 5 3下载下载下载第4章文件和目录4.1 引言上一章我们说明了执行I/O操作的基本函数。其讨论围绕普通文件的 I/O进行打开一个文件,读或写一个文件。本章将观察文件系统的其他特征和文件的性质。我们将从 s t a t函数开始,逐个说明s t a t结构的每一个成员以了解文件的所有属性。在此过程中,我们将说明修改这些属性的各个函数(更改所有者,更改许可权等),还将更详细地察看 U N I X文件系统的结构以及符号连接。本章结束部分介绍对目录进行操作的各个函数,并且开发了一个以降序遍历目录层次结构的函数。4.2
11、 stat、fstat 和lstat 函数本章讨论的中心是三个s t a t函数以及它们所返回的信息。#include#include int stat(const char*p a t h n a m e,struct stat*b u f);int fstat(int f i l e d e s,struct stat*b u f);int lstat(const char*p a t h n a m e,struct stat*b u f);三个函数的返回:若成功则为0,若出错则为-1给定一个p a t h n a m e,s t a t函数返回一个与此命名文件有关的信息结构,f s t
12、 a t函数获得已在描述符f i l e d e s上打开的文件的有关信息。l s t a t函数类似于s t a t,但是当命名的文件是一个符号连接时,l s t a t返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。(在4.2 1节中当以降序遍历目录层次结构时,需要用到l s t a t。4.1 6节将较详细地说明符号连接。)l s t a t函数不属于POSIX 1003.1-1990标准,但很可能加到1 0 0 3.1 a中。S V R 4和4.3+B S D支持l s t a t。第二个参数是个指针,它指向一个我们应提供的结构。这些函数填写由b u f指向的结构。该结构
13、的实际定义可能随实现而有所不同,但其基本形式是:P O S I X.1未定义s t _ r d e v,s t _ b l k s i z e和s t _ b l o c k s字段,S V R 4和4.3+B S D则定义了这些字段。注意,除最后两个以外,其他各成员都为基本系统数据类型(见2.7节)。我们将说明此结构的每个成员以了解文件属性。使用s t a t函数最多的可能是ls-l命令,用其可以获得有关一个文件的所有信息。4.3 文件类型至今我们已介绍了两种不同的文件类型普通文件和目录。U N I X系统的大多数文件是普通文件或目录,但是也有另外一些文件类型:(1)普通文件(regular
14、 file)。这是最常见的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据对于内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。(2)目录文件(directory file)。这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件。(3)字符特殊文件(character special file)。这种文件用于系统中某些类型的设备。(4)块特殊文件(block special file)。这种文件典型地用于磁盘设备。系统中的所有设备或者是字符特殊文件,或者是块特殊文
15、件。(5)F I F O。这种文件用于进程间的通信,有时也将其称为命名管道。1 4.5节将对其进行说明。(6)套接口(s o c k e t)。这种文件用于进程间的网络通信。套接口也可用于在一台宿主机上的进程之间的非网络通信。第1 5章将用套接口进行进程间的通信。只有4.3+B S D才返回套接口文件类型,虽然S V R 4支持用套接口进行进程间通信,但现在是经由套接口函数库实现的,而不是通过内核内的套接口文件类型,将来的S V R 4版本可能会支持套接口文件类型。(7)符号连接(symbolic link)。这种文件指向另一个文件。4.1 6节将更多地述及符号连接。文件类型信息包含在 s t
16、 a t结构的s t _ m o d e成员中。可以用表4-1中的宏确定文件类型。这些宏的参数都是s t a t结构中的s t _ m o d e成员。表4-1 在中的文件类型宏宏文 件 类 型S _ I S R E G()普通文件S _ I S D I R()目录文件S _ I S C H R()字符特殊文件S _ I S B L K()块特殊文件第4章文件和目录5 5下载(续)宏文 件 类 型S _ I S F I F O()管道或F I F OS _ I S L N K()符号连接(P O S I X.1或S V R 4无此类型)S _ I S S O C K()套接字(P O S I
17、X.1或S V R 4无此类型)实例程序4-1取其命令行参数,然后针对每一个命令行参数打印其文件类型。程序4-1 对每个命令行参数打印文件类型程序4-1的样本输出是:5 6U N I X环境高级编程下载其中,在第一命令行末端我们键入了一个反斜线,通知 s h e l l要在下一行继续键入命令,然后s h e l l在下一行上用其第二提示符。我们特地使用了l s t a t函数而不是s t a t函数以便检测符号连接。如若使用了s t a t函数,则决不会观察到符号连接。早期的U N I X版本并不提供S _ I S x x x宏,于是就需要将s t _ m o d e与屏蔽字S _ I F M
18、 T逻辑与,然后与名为S _ I F x x x的常数相比较。S V R 4和4.3+B S D在文件中定义了此屏蔽字和相关的常数。如若查看此文件,则可找到S _ I S D I R宏定义为:#define S_ISDIR(mode)(mode)&S_IFMT)=S_IFDIR)我们说过,普通文件是最主要的文件类型,但是观察一下在一个给定的系统中各种文件的比例是很有意思的。表4-2中显示了在一个中等规模的系统中的统计值。这一数据是由 4.2 1节中的程序得到的。表4-2 不同类型文件的计数值和比例文 件 类 型计数值比例(%)普通文件30 3699 1.7目录1 9015.7符号连接4 1 6
19、1.3字符特殊3 7 31.1块特殊6 10.2套接口50.0F I F O10.04.4 设置-用户-I D和设置-组-I D与一个进程相关联的I D有六个或更多,它们示于表4-3中。表4-3 与每个进程相关联的用户I D和组I D实际用户I D我们实际上是谁实际组I D有效用户I D有效组I D用于文件存取许可权检查添加组I D保存设置-用户-I D由e x e c函数保存保存设置-组-I D 实际用户I D和实际组I D标识我们究竟是谁。这两个字段在登录时取自口令文件中的登录项。通常,在一个登录会话期间这些值并不改变,但是超级用户进程有方法改变它们,8.1 0节将说明这些方法。有效用户I
20、 D,有效组I D以及添加组I D决定了我们的文件访问权,下一节将对此进行说明(我们已在1.8节中说明了添加组I D)。保存的设置-用户-I D和设置-组-I D在执行一个程序时包含了有效用户 I D和有效组I D的副本,在8.1 0节中说明s e t u i d函数时,将说明这两个保存值的作用。第4章文件和目录5 7下载在P O S I X.1中,这些保存的I D是可选择的。一个应用程序在编译时可测试常数_ P O S I X _ S AV E D _ I D S,或在运行时以参数_ S C _ S AV E D _ I D S调用函数s y s c o n f,以判断此实现是否支持这种特征
21、。S V R 4支持此特征。FIPS 151-1要求P O S I X.1的这种可选择特征。通常,有效用户I D等于实际用户I D,有效组I D等于实际组I D。每个文件有一个所有者和组所有者,所有者由 s t a t结构中的 s t _ u i d表示,组所有者则由s t _ g i d成员表示。当执行一个程序文件时,进程的有效用户 I D通常就是实际用户 I D,有效组I D通常是实际组I D。但是可以在文件方式字(s t _ m o d e)中设置一个特殊标志,其定义是“当执行此文件时,将进程的有效用户I D设置为文件的所有者(s t _ u i d)”。与此相类似,在文件方式字中可以设
22、置另一位,它使得执行此文件的进程的有效组 I D设置为文件的组所有者(s t _ g i d)。在文件方式字中的这两位被称之为设置-用户-I D(s e t-u s e r-I D)位和设置-组-I D(s e t-g r o u p-I D)位。例如,若文件所有者是超级用户,而且设置了该文件的设置-用户-I D位,然后当该程序由一个进程运行时,则该进程具有超级用户优先权。不管执行此文件的进程的实际用户I D是什么,都作这种处理。作为一个例子,U N I X程序p a s s w d(1)允许任一用户改变其口令,该程序是一个设置-用户-I D程序。因为该程序应能将用户的新口令写入口令文件中(一
23、般是/e t c/p a s s w d或/etc/shadow),而只有超级用户才具有对该文件的写许可权,所以需要使用设置-用户-I D特征。因为运行设置-用户-I D程序的进程通常得到额外的许可权,所以编写这种程序时要特别谨慎。第8章将更详细地讨论这种类型的程序。再返回到s t a t函数,设置-用户-I D位及设置-组-I D位都包含在s t _ m o d e值中。这两位可用常数S _ I S U I D和S _ I S G I D测试。4.5 文件存取许可权s t _ m o d e值也包含了对文件的存取许可权位。当提及文件时,指的是前面所提到的任何类型的文件。所有文件类型(目录,字
24、符特别文件等)都有存取许可权。很多人认为只有普通文件有存取许可权,这是一种误解。每个文件有9个存取许可权位,可将它们分成三类,见表4-4。在表4-4开头三行中,术语用户指的是文件所有者。c h m o d(1)命令用于修改这9个许可权位。该命令允许我们用 u表示用户(所有者),用g表示组,用o表示其他。有些书把这三种用户类型分别称之为所有者,组和世界。这会造成混乱,因为c h m o d命令用o表示其他,而不是所有者。我们将使用术语用户、组和其他,以便与c h m o d命令一致。图中的三类存取许可权读、写及执行以各种方式由不同的函数使用。我们将这些不同的使用方法列在下5 8U N I X环境
25、高级编程下载表4-4 9个存取许可权位,取自s t _ m o d e屏蔽意义S _ I R U S R用户-读S _ I W U S R用户-写S _ I X U S R用户-执行S _ I R G R P组-读S _ I W G R P组-写S _ I X G R P组-执行S _ I R O T H其他-读S _ I W O T H其他-写S _ I X O T H其他-执行面,当说明这些函数时,再进一步作讨论。第一个规则是,我们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应具有执行许可权。这就是为什么对于目录其执行许可权位常被称为搜索位的原因。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Unix 环境 高级 编程 002
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内