分类: 系统运维
2012-03-28 13:02:34
更新的系统提供了一个名为/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。