Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1426338
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: 系统运维

2012-05-14 18:49:56

文件I/O(File I/O)--/dev/fd

更新的系统提供了一个名为/dev/fd的目录,它下面的文件名为0、1、2等。打开文件/dev/fd/n等价于假设描述符n已经打开并复制描述符n。


/dev/fd特性由Tom Duff开发,并在Research UNIX系统的第8版出现。本文提及的4个系统都支持这个特性:FreeBSD 5.2.1、Linux 2.4.22、Mac OS X 10.3和Solaris 9。但它不是POSIX.1的一部分。


在函数调用fd = open("dev/fd/0", mode);里,多数系统都忽略指定的mode,而其它系统要求mode为引用文件(本例为标准输入)在打开时的模式的子集。因为前面的open等价于 fd = dup(0);,所以描述符0和fd共享同一个文件表项。比如,如果描述符0以只读方式打开,我们也只能通过fd来读。即使系统忽略了open模式,而且 函数调用fd = open("/dev/fd/0", O_RDWR);成功了,我们也不在向fd中写入。


我们也可以用/dev/fd路径名作为creat函数和指定O_CREAT的open函数的参数。举个例子,这允许调用creat函数的程序仍然可以工作,如果路径名参数为/dev/fd/1。


一些系统提供了路径名/dev/stdin、/dev/stdout和/dev/stderr。这些路径名等价于/dev/fd/0、/dev/fd/1和/dev/fd/2。


/dev/fd文件的主要在shell里使用。它允许使用路径名参数的程序可以和处理其它路径名一样的方式,来处理标准输出和标准输入。比如,cat程序 指定寻找一个名为“-”的文件名表示标准输入。命令filter file2 | cat file1 - file3 | lpr就是一个例子。首先,cat读取file1,接着是标准输入(从filter程序的file2的输出),然后是file3.如果/dev/fd被支 持,那“-”的特殊处理可以从cat中移除,我们可以输入
filter file2 | cat file 1 /dev/fd/0 file3 | lpr。


“-”作为一个命令行参数表示标准输入或标准输出的特殊意思已经蔓延到很多程序。如果我们指定“-”为第一个文件同样会有问题,因为它看起来像另一个命令行选项的开头。使用/dev/fd会更加规范和清晰。
阅读(605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~