linux知识与理解(一)

2 篇文章 0 订阅

1.关于文件操作中的某些宏定义常量的问题(关于文件状态标志常量屏蔽字O_ACCMODE)
文件标志常量在检测其他文件标志常量时有至关重要的用处,所以它被叫做文件状态标志常量屏蔽字,就好像掩码一样,通过它与文件状态标志进行与运算,可以得到O_RDONLY,O_WRONLY,
O_RDWR,O_EXEC,O_SEARCH中的任意一个,且他们5个常量在文件标志常量中一次只能出现其中一个(值得注意的是,O_SEARCH与O_EXEC常量在我所使用的Centos 7系统中的fcntl头文件中不存在,所以O_ACCMODE屏蔽字应该只可应用于,或者说在linux系统中只可应用于,上述常量的前三个。)至于说为什么要通过与屏蔽字进行与运算才能得到对应的标志常量,原因是这样的,在open函数中我们通过某种方式打开某个文件,也就是一个或者数个标志常量进行或运算得到文件状态标志,通过fcntl结合F_GETFL常量得到的是一堆标志常量进行或运算得到的文件状态标志,通过和屏蔽字进行与运算从而得到我们想要的结果(标志常量)。最后关于这些常量的值,在我的系统中可以在/usr/include/asm-generic/fcntl.h中找到对应的值,都是硬编码到头文件中的。

2.在进行某些程序的命令行写入的时候,我发现一个很有趣的问题,具体的例子就是,我写了一个名字为get_file.status.flag的程序,该程序的作用是得到某个文件描述符的打开文件表中的稳健状态标志。
在命令行中我进行了如下的输入:

$ ./get_file.status.flag 0
$ ./get_file.status.flag 1
$ ./get_file.status.flag 2
$ ./get_file.status.flag 0 < /dev/tty
$ ./get_file.status.flag 0 0< /dev/tty
$ ./get_file.status.flag 1 > temp.foo
$ ./get_file.status.flag 1 1> temp.foo
$ ./get_file.status.flag 2 2>>temp.foo
$ ./get_file.status.flag 2 >>temp.foo
$ ./get_file.status.flag 5 5<>temp.foo

这些输入我会一个一个尝试解释,由于我不是真的非常理解,所以下面只是写出了我经过思考后的我认为比较合理的猜测。
首先我要对命令行的格式进行一下说明,在main函数中我进行了长度的判断,如果长度不为2就表示格式错误,所以实际上上面的每一行只有"./get_file.status.flag 0",类似这样格式的是main函数所规定的命令行格式。
下面会一个个解释命令行语句:

$ ./get_file.status.flag 0
结果:read write
解释:由于我们传入给main函数的第二个参数是文件描述符,本例中描述符为0,表示标准输入,标准输入的文件状态标志位可读可写。

$ ./get_file.status.flag 1
结果:read write
解释:同上,描述符1是标准输出

$ ./get_file.status.flag 2
结果:read write
解释:同上,描述符2是标准输错

$ ./get_file.status.flag 0 < /dev/tty
结果:read only
解释:这个我的理解是,这个命令行语句首先将/dev/tty与标准输入相连,由于与标准输入相连,表示从/dev/tty进行输入,所以“<”符号将描述符为0,但是现在文件指针可能指向/dev/tty的打开文件表,并将里面的文件状态标记改为只读,之后执行get_file.status.flag程序时,程序访问0号描述符,返回0号描述符对应的打开文件表(也就是/dev/tty文件的打开文件表)中的文件状态标记,最终得到只读结果。(注意:经过我多次的实验,这种情况只有在描述符0与“<”对应描述符1与">"对应时才会成立,具体原因我也不清楚,所以以上仅为个人猜测)

$ ./get_file.status.flag 0 0< /dev/tty
结果:同上
解释:我认为这个例子和我上面例子是相同的,总结一下吧,就是说如果是$ ./get_file.status.flag 0 0< /dev/tty这样的命令行,那么一定是先做"0 < /dev/tty",先将文件与标准输入相绑定,如果是类似这样的格式$ ./get_file.status.flag 0< /dev/tty,那么只有在“0与<”或者“1与>”时才会如上这样做,其他情况例如$ ./get_file.status.flag 1 < /dev/tty返回的是读写,也就是本来标准输入或者标准输出的权限。

$ ./get_file.status.flag 1 > temp.foo
$ ./get_file.status.flag 1 1> temp.foo
结果:write only
解释:同上

$ ./get_file.status.flag 2 2>>temp.foo
结果:write only
, append
解释:上面结果的含义是只写且追加写

$ ./get_file.status.flag 2 >>temp.foo
结果:read write
解释:如上解释

$ ./get_file.status.flag 5 5<>temp.foo
结果:read write
解释:在标识符为5位置用读写的方式打开temp.foo文件,其他的同上。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值