lseek文件定位 与 dup重定向应用
在unix环境高级编程第二版的一段demo程序如下:
改写一下程序,实现重定位以命令行输入的文件作为标准输入,判断该文件是否可以进行lseek操作
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd;
if(argc != 2){
printf("usage:%s file path\n",argv[0]);
return -1;
}
fd = open(argv[1],O_RDONLY|O_NONBLOCK);
if(fd < 0){
perror("open file error");
return -2;
}
close(STDIN_FILENO);
dup(fd);
close(fd);
int ret = lseek(STDIN_FILENO,0,SEEK_END);
if(ret == -1){
perror("cannot lseek");
}
else{
printf("lseek ok\n");
}
return 0;
}
使用dup2函数可以实现同样的功能。
在这段程序中,有一个地方需要注意的是在使用open打开文件的时候需要在模式位或上O_NONBLOCK标志,否则如果打开的是fifo管道文件,则会被阻塞在open函数。
THE END!