实验目标
通过一段程序查看输入重定向工作中文件描述符0对应的文件的变化, 以了解文件描述符和标准输入重定向的基本工作机制
实验方法
通过不进行标准输入重定向和进行标准输入重定向两个实验, 分别检查进程的文件描述符0对应的文件, 对比结果然后分析
实验过程
- 测试程序
int main(void){
if(lseek(STDIN_FILENO,0,SEEK_CUR) == -1){
printf("cannot set offset about this file\n");
sleep(100);
}
else{
printf("can set off about this file\n");
sleep(100);
}
exit(0);
}
- 不进行输入重定向
编译后直接执行, 通过ps -aux | grep lseek
查到进程号, 然后根据进程号通过lsof -p PID
查看文件描述符0对应的文件, 得到如下结果:
可以看到0号文件描述符对应的是一个设备文件, 应该是一个标准输入设备文件
- 进行输入重定向
编译后,./lseek < ./makefile
通过输入重定向将输入重定向到另一个文件, 通过与上面相同命令查看文件描述符0对应的文件, 得到如下的结果:
可以看到0号文件描述符对应的是我们指定的文件
实验结论
标准输入重定向是通过打开被指定重定向的目标文件后让其占据文件描述符0, 而标准输入设备文件被关闭了, 此时标准输入无法正常工作(输入设备没有被正常打开)