在通常情况下,open()返回新的文件描述符,如果发生错误,则返回-1,在这种情况下,适当地设置errno.
我不明白为什么在这里使用这个errno机制?这里的目的是什么?为什么我们无法映射所有错误与一些负回报否?
喜欢
fd = open("/dev/tty0",O_RDWR | O_SYNC); if(fd == -1) printf("this is EACCES error"); else if (fd == -2) printf("this is EPERM error");
errno机制有什么好处吗?如果是的话,我想知道/理解,然后在其他事情我也可以使用这种机制.
解决方法
由于fopen返回一个FILE *,您不能指望它返回该指针中的错误代码:指针的唯一“特殊”值为0.
正如你所观察到的,为了打开这个限制是不成立的.事实上,系统作为linux完全按照你们在较低级别提出的建议.如果出现问题,系统调用将会返回负错误代码.那个(否定的)代码然后被一个浅的用户空间包装器插入到errno中,然后它返回-1来指示应用程序的错误.
这样做的原因纯粹是历史的.在好的旧时代,没有线程,而errno仍然只是一个简单的全局变量.当时所选择的策略没有太多的开销,也可能似乎是操作系统和应用程序之间通信的可接受的方式.由于这样的接口基本上不能改变而不会破坏大量的代码,所以我们会把errno作为线程本地的伪变量.
这不是理想的,但开销并不像听起来那么糟糕,因为这些显然是错误的指示,应该仅仅是特别地发生.