文件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会更加规范和清晰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值