为什么不能保存errno的数值?

Why can't I save the numeric value of errno?

我试图保存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中?

调用 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 不能修改它。