Apue的3-4.c例子的理解。。。

每次学习都没有记录,这里我就记录一下。


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




评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值