从stat结构体的st_mode成员中获取文件的权限信息

首先,我们来看一下mode_t类型的结构

 

可以看出,文件的权限位于这个变量的最后9位上。

 

这是特征位的定义

  1. S_IFMT      0170000     文件类型的位遮罩  
  2. S_IFSOCK    0140000     socket  
  3. S_IFLNK     0120000     符号链接(symbolic link)  
  4. S_IFREG     0100000     一般文件  
  5. S_IFBLK     0060000     区块装置(block device)  
  6. S_IFDIR     0040000     目录  
  7. S_IFCHR     0020000     字符装置(character device)  
  8. S_IFIFO     0010000     先进先出(fifo)  
  9. S_ISUID     0004000     文件的(set user-id on execution)位  
  10. S_ISGID     0002000     文件的(set group-id on execution)位  
  11. S_ISVTX     0001000     文件的sticky位  
  12. S_IRWXU     00700       文件所有者的遮罩值(即所有权限值)  
  13. S_IRUSR     00400       文件所有者具可读取权限  
  14. S_IWUSR     00200       文件所有者具可写入权限  
  15. S_IXUSR     00100       文件所有者具可执行权限  
  16. S_IRWXG     00070       用户组的遮罩值(即所有权限值)  
  17. S_IRGRP     00040       用户组具可读取权限  
  18. S_IWGRP     00020       用户组具可写入权限  
  19. S_IXGRP     00010       用户组具可执行权限  
  20. S_IRWXO     00007       其他用户的遮罩值(即所有权限值)  
  21. S_IROTH     00004       其他用户具可读取权限  
  22. S_IWOTH     00002       其他用户具可写入权限  
  23. S_IXOTH     00001       其他用户具可执行权限  
  24. 摘自《Linux C 函数库参考手册》  

于是我尝试用这样的语句获取权限特征位:

printf("%o %o %o\n", buff.st_mode&S_IRWXU, buff.st_mode&S_IRWXG, buff.st_mode&S_IRWXO);

但得到的输出是700 60 6

于是我把代码写成了这样

printf("%o\n", (buff.st_mode&S_IRWXU)+(buff.st_mode&S_IRWXG)+(buff.st_mode&S_IRWXO));

就得到了正确的结果:766。

这里需要说明的是,貌似C中+号的运算优先级比&高,所以要使用括号来保证按位与运算先进行。

使用xargs将前一管道的每个结果作为当前管道的参数

学校这一学期开了Linux课,课程实验里要求将根目录下所有.txt文件的大小的总和计算出来,但是如果直接用

find / -name '*.txt' | wc -c

的话,算出的是find的查找结果的总字节数,而不是查找到的所有文件的总字节数。

到网上查了一下,发现xargs可以将前一管道的每一个结果作文当前管道的参数,遂将命令改为

find / -name '*.txt' | xargs wc -c

得出的结果中就有所有文件的总字节数。再用grep将总字节数的条目拿出来就好了。

SHARP MZ-700 复活记

最近在网络上淘到了一台80年代产的SHARP MZ-700计算机,不知为何我总是对这些老旧又精致的东西感兴趣。正好看到它在《掟上今日子的备忘录》中也出场了,就想让这台机器正常地运作起来。

首先我在宿舍,没有电视和其它可以连接AV视频线的显示设备。为了解决这个问题,我在网上买了一个USB采集卡,支持AV线和S端子输入,接上以后显示效果良好。

还有一个重要问题是,MZ-700本身不带有程序功能,BASIC解释环境和其它程序都存储在磁带上。现在原装的磁带可不好找了,好在网上还能下载到数据文件。这些数据文件是MZF格式,

http://www.sharpmz.org/

这个网站提供了mzf2wav.exe工具,就是说可以将程序转换为磁带上的音频。这样就简单了,只要找到一台录音机设备和一盘空白磁带,就可以用对录线重新制作程序磁带了。

不过,我上哪找录音机?难道还要买一台?太不划算了。

http://www.sharpmz.org/mztape.htm

这个页面提供了解决方案:MZ-700背后的接口面板上提供了两个连接外置录音设备的3.5mm音频线插孔,可以连接到PC。这可真是好消息!考虑到稳定性,实现这一功能的mztape.exe需要在纯DOS环境下运行,不过就算是虚拟机也依然比较麻烦。其实https://www.youtube.com/watch?v=tEvnMqRa6Tc

这段视频已经很明显地告诉我们,用WINDOWS也没有问题,只是要小心系统发出额外的声音罢了。按照

http://tieba.baidu.com/p/4163131450

提供的教程,将磁带机插口的1-7;2-8;3-5插头短接(别看到短接两个字就发憷,实际上很好做的,随便找一根什么线,截成三段,每一段两端让金属丝裸露,然后拧成一个小小的圆环就行了,总之让金属丝能接触到接口针并且能固定住就可以),就可以用外置的read口输入数据了。至于怎么输入,用手机播放WAV就好了嘛。