【问题标题】:Why can't I save the numeric value of errno? [closed]为什么不能保存errno的数值? [关闭]
【发布时间】:2021-10-25 10:06:27
【问题描述】:

我尝试保存 errno 的值以供以后评估, 但失败了:

#include <stdio.h>
#include <errno.h>
#include <unistd.h>

void main(void)
{

  int read_errno;

  /* read() operation sets errno */
  read(...);
  read_errno = errno;
  printf("errno was %s\n", strerror(errno));
  printf("errno was %s\n", strerror(read_errno));
}

这里的结果是:

errno was Stream ioctl timeout
errno was Success

为什么我不能将errno的数值保存到变量read_errno中?

【问题讨论】:

  • 您打印了两次strerror(errno),而不是strerror(read_errno)
  • 您的程序从不使用值read_errno,因此不清楚您是如何断定它没有正确设置的。您能否进一步解释您希望看到的内容以及原因/
  • 啊,抱歉,它现在在第二次调用printf() 时使用read_errno
  • 很确定您需要包含&lt;string.h&gt; 才能使用strerror
  • 如果还有问题,请发帖Minimal Reproducible Example

标签: c c99 errno


【解决方案1】:

printfstrerror 的调用本身会重置* errno 变量,因此第二个printf 会打印第一个的结果,而不是read。好的做法是在任何其他函数调用之前尽快保存它。

正确的例子:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(){
    errno=EPERM; // An example
    int read_errno = errno;
    printf("errno was %s\n", strerror(read_errno));
    printf("errno was %s\n", strerror(read_errno));
}

输出:

errno was Operation not permitted
errno was Operation not permitted

*他们不必重置它,而且成功调用strerror不能修改它。

【讨论】:

  • 即使我在调用printf()之前切换了顺序以便将errno保存为read_errno,我得到了相同的结果...
  • @LukesDiner 添加了一个正确的例子。
  • @Quimby 不应该第二次 printf 打印 strerror(errno) 而不是 strerror(read_errno)
  • @Jabberwocky 好吧,最初的问题是为什么第二个相同的printf 打印出不同的值。我回答说是因为修改了errno。我更正的代码正确打印了两次相同的消息。所以不,这是故意的。该问题现已修改,并且还显示了正确的代码,这使得它变得混乱。
猜你喜欢
  • 2012-07-14
  • 2019-08-04
  • 2018-08-03
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多