APUE 3e中`./a.out 0 < /dev/tty`重定向的实现原理疑问
关于APUE中
fcntl()测试命令的疑问解答 - 首先明确:shell的重定向操作和命令行参数是完全独立的两个流程,不会互相覆盖。
- 命令行里的
0是程序的命令行参数,会被传入程序的argv数组,作用是告诉程序:“去检查文件描述符0的权限”。 - 而
< /dev/tty是shell在启动程序之前就完成的操作:shell会以只读模式打开/dev/tty设备文件,然后把这个打开的文件关联到程序的文件描述符0(也就是标准输入)。这个过程和程序的命令行参数没有任何关系,程序拿到的参数依然是0,不会被修改。 - 程序的逻辑是根据参数指定的文件描述符(这里是0),调用
fcntl()获取它的打开权限。因为shell已经把fd 0重定向到了只读打开的/dev/tty,所以程序检测后输出read only。
简单总结:参数0是让程序“指定要检查哪个文件描述符”,重定向是让“这个文件描述符预先关联到目标文件”,两者分工明确,互不干扰。
内容的提问来源于stack exchange,提问作者woniok
相关产品推荐
相关产品推荐

