全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
继续分析之前的shell程序代码,看到了一个fork1的实现。
Fork之前还是看过的,但是也已经忘得差不多了,这个fork1就是fork的一种应用封装。而这里面要弄懂它有别于fork本身的地方,还得弄明白perror函数的使用。
1. perror也是一个库函数,主要的功能就是打印系统错误消息。
2. 这个接口对于传入的参数是有要求的,稍后我倒是可以做一个非常规使用的测试。
3. 在调用这个接口的时候,执行的错误信息会随之附加在输出消息之后。
4. 如果运行出错则返回-1。
1. 这个是我在看UNIX或者linux接口的时候看到的满足的标准比较多的一个接口了,看起来折腾操作系统最终的归宿其实还是少不了要跟这种标准打交道。
2. 这个函数也是近期看到的比较适应于Linux的环境的了,没有之前看到的符合POSIX,linux实现可能略有不同的描述。
为了测试perror的基础功能,我增加了如上的代码做一个简单的测试。
这是编译后运行的效果,从这里看这个错误消息输出的时候其实是自带着换行符号的。而前面提到的errno,有时候提供的信息也不一定是错误,成功也是其中的一种。我现在的程序没有遇到什么错误,因此这里的输出都是成功的。
关于错误参数的测试,其实我这里测试错误,应该顺便输出其返回值。为此,修改如下:
这里测试遇到了一点意外:
编译通不过!
其实原因也真的是很简单,那就是这个文档中关于返回值的理解是有误的。而这个函数的原型本身返回值其实不是int。
关于函数原型其实是可以从这里看到的。
然而,文档中又描述了错误的返回值。具体如下:
这里不仔细看或许还以为是这个函数的返回值是-1,其实这里提到的则是系统调用的返回值。因此,两者是不对等的。再退一步,看文档的标注信息,其实这个函数不是系统调用分类中的函数。因此,这里只是我自己前面看文档中犯了一个小错误罢了。