errno是个全局的int型变量,当调用一个系统函数时不管成功不成功都有可能改变errno的值。但只有不成功时errno的值才是有意义的。如果要真的想用errno进行多次打印,刚可以先将其缓存一下。
下面的例子:
<pre lang="c" escaped="true">
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(void)
{
FILE *fp = fopen("abcde", "r");
if (NULL == fp)
{
int err = errno;
printf("errno: %d.\n", errno);
errno = err;
perror("Open file abcde");
errno = err;
fprintf(stderr, "%s, line %d:%s\n", __FILE__, __LINE__, strerror(errno));
exit(1);
}
return 0;
}
</pre>
运行结果:
<blockquote>
[sbso@localhost c]$ vim perror_test.c
[sbso@localhost c]$ gcc perror_test.c -o perror_test
[sbso@localhost c]$ ./perror_test
errno: 2.
Open file abcde: No such file or directory
perror_test.c, line 17:No such file or directory
[sbso@localhost c]$
</blockquote>