一个问题:关于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,和 重定向没有必然的关系。