|
我刚刚开始看这本书,看到了第二章,遇到了几个问题。请各位指教一下,谢谢了。
第一个问题:
在第一章的课后习题中,1.4:
对于出错处理函数err_sys,当调用该函数时,保存了errno的值。为什么?
其中函数原型是:
void
err_sys(const char *fmt,...)
{
va_list ap;
va_start(ap,fmt);
err_doit(1,fmt,ap);
va_end(ap);
exit(1);
}
其中,
static void
err_doit(int errnoflag, const char *fmt, va_list ap)
{
int errno_save;
char buf[MAXLIZE];
errno_save=errno;
vsprintf(buf, fmt, ap);
if(errnoflag)
sprintf(buf+strlen(buf), ": %s", strerror(errno_save));
strcat(buf, "\n");
fflush(stdout);
fputs(buf,stderr);
fflush(NULL);
return;
}
在他的习题答案中是这样解释的:
调用ffush, fprintf, vprintf函数可修改errno的值。如果它的值改变了没有保存,则最终显示的出错信息是不正确的。
他还举了一个不保存errno的例子:
#include<stdio.h>
int
main()
{
int fd;
extern int errno;
if ( ( fd = open( "no/such/file", 0)) < 0){
printf("open error:");
printf( "errno = %d\n", errno);
}
exit(0);
}
执行上面的程序,结果为:
$ grep BSD /etc/motd
4.3 BSD UNIX #29:.......
$ a.out
open error :errno=2 工作正常,stdout是一个终端
$ a.out >temp.foo
open error :errno=25 错误
我的问题是:
首先,什么叫做”保存errno的值”
其次,为什么说err_sys保存了errno的值
最后,为什么说上面这个例子没有保存errno的值,正确的errno=? |
|