gpt4 book ai didi

c - 为什么 fopen() 或 open() 使用 errno 而不是只返回错误代码?

转载 作者:IT王子 更新时间:2023-10-29 00:08:59 26 4
gpt4 key购买 nike

在通常情况下,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

如您所见,对于 open,此限制不成立。事实上,像 linux 这样的系统完全按照您在较低级别上的建议进行操作。如果出现问题,幕后的系统调用将返回负错误代码。该(否定的)代码然后通过浅用户空间包装器插入 errno,然后返回 -1 以向应用程序指示错误。

这样做的原因纯粹是历史原因。在美好的过去,没有线程,errno 仍然只是一个简单的全局变量。当时所选择的策略不会产生太多开销,并且可能看起来是操作系统和应用程序之间可以接受的通信方式。由于此类接口(interface)基本上无法在不破坏大量代码的情况下进行更改,因此我们将坚持使用 errno 作为线程本地的伪变量。

这并不理想,但开销并不像听起来那么糟糕,因为这些显然是错误指示,应该只在异常(exception)情况下发生。

关于c - 为什么 fopen() 或 open() 使用 errno 而不是只返回错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11413366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com