全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
在看MIT的OS课程的时候发现自己动不动就因为只是的缺少而卡住,而这个学习占据了我工作之余很多的时间。现在都有一点觉得通关不了的感觉了,缺乏的知识实在是多。不过,反正时光漫长不知如何抛,在这其中慢慢熬也算是一种自我修炼了。
我看到一段这样的代码,一下子把我给卡住了。加上最近这段时间的个人状态欠佳,第一行代码其实是卡了我好几天。对于专门从事UNIX或者LINUX平台的开发人员来说,这或许会笑掉大牙。不过,真的是隔行如隔山,至少他们的行业把我给拦住了。为了弄明白这是在干什么,绝对还是一点点来。先搞清楚fileno的用法以及里面的这个参数的由来。
1. fileno的作用是从标准的输入、输出流中提取出来文件描述符。
2. 关于文件描述符的使用,在传递给可能关闭它的代码之前先试用dup进行复制。这一点,依然没有看懂。但是之前看了一些xv6的书籍,至少是到了dup等概念了。
3. 这个接口运行成功则会返回文件描述符,如果运行失败返回-1。这里提到了一个errorno的概念,再次跳过吧。
4. 这个函数有一个属性,那就是是否线程安全,数值为MT-Safe。
这个接口符合POSIX.1-2001以及POSIX.1-2008的标准。
好,这样fileno的功能基本了解了。接下来,看看stdin是一个什么信息。这个虽然猜得出来,但是还是得去求证一下。
1. 看第二份这样的文件,看到这个函数后面带着一个数字,大部分函数都有,这会是什么概念呢?后面再去分析。
2. FILE数据类型是一个_iobuf的结构体封装成的,里面的具体成员信息在此也不做具体的了解了。我大概看了一下,临时决定先跳过。
3. 其实几个标准的IO流在UNIX的角度都是文件。
4. FILE是UNIX文件描述符缓冲包装器。
这几个标准的输入、输出、错误都是符合C89标准的,而不是POSIX。这个标准还要求软件启动的时候需要默认打开这三个IO流。其中,stderr是不带有缓冲的,stdout则是带有缓冲机制的。因此,这样可能会导致一定的显示异常。
我在主页上看到了这样的描述,突然间觉得前面的数字疑问有了答案。1应该代表的是用户命令,2则是系统调用,3是库函数,4是设备,5是文件格式,6暂时看着没有,7是概览、约定以及其他,8是超级用户以及系统管理员命令。
虽然磨了很久,但是感觉终究是可以继续下去了。
根据上面的知识,应该可以推断出来,其实上面的fileno(stdin)的结果应该是0。
其实的测试结果也看得出来,这个推测是准确的。