每次学习都没有记录,这里我就记录一下。
Linux中标准输入为0,标准输出为1,标准错误输出为2
那么./a.out 0 就是测试标准输入是否具可读。因为默认标准输入是终端,终端是可读可写的。故输出为read write
但是$ ./a.out 0 < /dev/tty 实际是$ ./a.out 0 0< /dev/tty是把/dev/tty重定向为标准输入,那么fcntl(0,F_GETFL,0)就是判断/dev/tty的读写属性,而/dev/tty是只读的,故输出为read ony
若是$ ./a.out 1 < /dev/tty 实际是$ ./a.out 1 0< /dev/tty是把/dev/tty重定向为标准输入,但此时的标准输出未变,仍为终端。但因为argv[1]的值为1,测试的仍然是终端的属性,故输出为read write。
// 暂时先写到这,可能理解不太对,还要再改改。
$ ./a.out 1 > temp.foo 就是输出重定向,temp.foo是个新建的文件,那么fcntl(1, F_GETFL, 0);就是判断temp.foo的读写属性,新建的temp.foo默认是read write的
$ ./a.out 0 > temp.foo同理,输出被重定向到temp.foo,但是判断的仍然是标准输入,也就是终端,故还是read write
//下面讨论./a.out 2 2>>temp.foo
先来补点理论知识
2代表stderr
2>>filename # 重定向并追加stderr到文件"filename".那么./a.out 2 2>>temp.foo 就是检查被重定向后的文件temp.foo的在文件描述符2上的属性
对于
$ ./a.out 5 5<>temp.foo同样需要补理论知识
[j]<>filename # 为了读写"filename", 把文件"filename"打开, 并且将文件描述符"j"分配给它. # 如果文件"filename"不存在, 那么就创建它. # 如果文件描述符"j"没指定, 那默认是fd 0, stdin.5<>temp.foo表示在文件描述符5上打开文件temp.foo以供读和写,程序就是检查temp.foo的读写属性,很明显我是"<>"的,也就是读写打开这个文件的
那么结果也就是read write