- 论坛徽章:
- 0
|
比较新的系统都提供名为/dev/fd的目录,其目录项是名为0、1、2等的文件。打开文件/dev/fd/n等效于复制描述符n(假定描述符n是打开的)。
在函数中调用:
fd=open("/dev/fd/0",mode);
大多数系统忽略所指定的mode,而另外一些则要求mode是所涉及的文件(在这里则是标准输入)原先打开时所使用的mode的子集。因为上面的打开等效于:
fd=dup(0);
描述符0和fd共享同一文件表项(见图3-3)。例如,若描述符0被只读打开,那么我们也只对fd进行读操作。即使系统忽略打开方式,并且下列调用成功:
fd=open("/dev/fd/0",O_RDWR);
我们仍然不能对fd进行写操作。
我们也可以用/dev/fd作为路径名参数调用creat,或调用open,并同时指定O_CREAT。这就允许调用creat的程序,如果路径名参数是/dev/fd/1等仍能工作。
某些系统提供路径名/dev/stdin,/dev/stdout和/dev/stderr。这些等效于/dev/fd/0,/dev/fd/1和/dev/fd/2。
/dev/fd文件主要由shell使用,这允许程序以对待其他路径名一样的方式使用路径名参数来处理标准输入和标准输出。例如,cat(1)程序将命令行中的一个单独的-特别解释为一个输入文件名,该文件指的是标准输入。例如:
filter file2|cat file1 - file3|lpr
首先cat读file1,接着读其标准输入(也就是filterfile2命令的输出),然后读file3,如若支持/dev/fd,则可以删除cat对-的特殊处理,于是我们就可键入下列命令行:
filter file2|cat file1 /dev/fd/0 file3|lpr
在命令行中用-作为一个参数特指标准输入或标准输出已由很多程序采用。但是这会带来一些问题,例如若用-指定第一个文件,那么它看来就像开始了另一个命令行的选择项。/dev/fd则提高了文件名参数的一致性,也更加清晰。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/34065/showart_286020.html |
|