日期:2014-05-16  浏览次数:20708 次

一个问题:关于unix环境高级编程的一段代码
是关于lseek和STDIN_FILENO的



#include "apue.h"

int
main(void)
{
    if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1)
       printf("cannot seek\n");
    else
       printf("seek OK\n");
    exit(0);
}


执行:
$ ./a.out < /etc/motd
   seek OK
   $ cat < /etc/motd | ./a.out
   cannot seek
   $ ./a.out < /var/spool/cron/FIFO
   cannot seek

我理解是STDIN_FILENO代表标准输入,所以当第一行./a.out < /etc/motd的时候,应该是“ < /etc/motd”吧,而不是“/etc/motd”,对应到第三次输入的时候也应该包含'<'号的,为什么第三行是不能seek呢?重定向的话也要是 >>才是啊
求大侠解释
------解决方案--------------------
第三个看名字起来是fifo管道文件,是不可以seek的。
------解决方案--------------------
./a.out < /etc/motd
这里 < 的作用:
类似dup2()
首先close(0),之后open(/etc/motd,),此时open应该返回0
也就是说  该进程的0 file descriptor 指向了文件  /etc/motd了。

由于这是一个regular file,自然可以seek.
第三个,二楼已经讲过了:FIFO不可以seek

至于重定向,应该是  <  和 >
>>只是append,和 重定向没有必然的关系。