为什么不能保存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中?
调用 printf
或 strerror
本身会重置* 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
不能修改它。
我试图保存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中?
调用 printf
或 strerror
本身会重置* 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
不能修改它。