么影响。
对于ANSI C原型,他用省略号表示其余参数。但是,通常只有另外一个参数,他常
常是指向
一个变量或结构的指针。
在此原型中,我们表示的只是ioctl函数本身所需要的头文档。通常,还需要另外
的设备专
用头文档。例如,在POSIX1所说明的基本操作之外,终端ioctl都需要头文档<t
ermiosh
>。
现在,ioctl的主要用途是什么呢?我们将43 BSD的ioctl操作分类示于图37中
。
图37〓43 BSD ioctl操作
磁带操作使我们能够在磁带上写一个文档结束标志,反绕磁带,越过指定个数的文
件或记录
等等,用本章中的其他函数(read,write,lseek等)都难于表示这些操作,所以,用
ioctl是
对这些设备进行操作的最容易方法。
在1112节中存取和配置终端窗口时,在124中说明流系统时,连同在197节中
述及仿终
端的高级功能时,我们都将使用ioctl。
315〓/dev/fd
比较新的系统都提供名为/dev/fd的目录,其目录项是名为0,1,2等的文档。打开
文档/dev
/fd/n等效于复制描述符n(假定描述符n是打开的)。
/dev/fd这种特征是由Tom Duff研发的,他首先出现在research Unix System的第
8版中,SV
R4和43 BSD支持这种特征。他不是POSIX1的组成部分
在函数中调用
fd=open("/dev/fd/0",mode);
大多数系统忽略所指定的mode,而另外一些则需要mode是所涉及的文档(在我们这
里则是标
准输入)原先打开时所使用的mode的子集。因为上面的打开等效于:
fd=dup(0);
描述符0和fd共享同一文档表项(图34)。例如,若描述符0被只读打开,那么我们
也只对fd
进行读操作。即使系统忽略打开方式,并且下列调用成功:
fd=open("/dev/fd/0",O[CD#*2]RDWR);
我们仍然不能对fd进行写操作。
我们也能够用/dev/fd作为路径名参数调用creat,或调用open,并同时指定O[CD#
*2]CREAT
。这就允许调用creat的程式,假如路径名参数是/dev/fd/1等仍能工作。
某些系统提供路径名/dev/stdin,/dev/stdout和/dev/stderr。这些等效于/dev/f
d/0,/dev/
fd/1和/dev/fd/2。
/dev/fd文档主要由shell使用,这允许程式以对待其他路径名相同的方式使用路径
名参数来
处理标准输入和标准输出。例如,cat(1)程式将命令行中的一个单独的'-'特别解
释为一
个输入文档名,该文档指的是标准输入。例如,
filter file2 |cat file1-file3|lpr
首先cat读file1,接着读其标准输入(也就是filter file2命令的输出),然后读f
ile3,如
若支持/dev/fd,则能够删除cat对一的特别处理,于是我们就可键入下列命令行:
filter file2 |cat file1 /dev/fd/0 file3 |lpr
在命令行中用'-'作为一个参数特指标准输入或标准输出已由很多程式采用。但是
这会带
来一些问题,例如若用'-'指定第一个文档,那么他看来就象是开始了另一个命令
行的选
择项。/dev/fd则提高了文档名参数的一致性,也更加清楚。
316〓摘要
本章说明了传统的Unix I/O函数。因为每个read,write都因调用系统调用而进入系
统核,所
以称这些函数为不带缓存的I/O函数。在只使用read和write情况下,我们观察了不
同I/O长
度,对读一个文档所需时间的影响。
在说明多个进程对同一文档进行添写操作连同多个进程创建同一文档时,本章介绍
了原子操
作。我们也介绍了系统核用来共享打开文档信息的数据结构。在本书的稍后部分我
们还将涉
及这些数据结构。
我们也说明了ioctl和fcntl函数。在第十二章中,还将使用这两个函数,将ioctl
用于流I/O系统,将fcntl用于记录锁。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




