⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000020.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
pid_t&nbsp;&nbsp;&nbsp;lock_test(int,&nbsp;int,&nbsp;off_t,&nbsp;int,&nbsp;off_t);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;{Prog&nbsp;&nbsp;<BR>locktest}&nbsp;*/&nbsp;&nbsp;<BR>#define&nbsp;is_readlock(fd,&nbsp;offset,&nbsp;whence,&nbsp;len)&nbsp;\&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock_test(fd,&nbsp;F_RDLCK,&nbsp;offset,&nbsp;whence,&nbsp;len)&nbsp;&nbsp;<BR>#define&nbsp;is_writelock(fd,&nbsp;offset,&nbsp;whence,&nbsp;len)&nbsp;\&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock_test(fd,&nbsp;F_WRLCK,&nbsp;offset,&nbsp;whence,&nbsp;len)&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;err_dump(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;{App&nbsp;misc_source}&nbsp;*/&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;err_msg(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;err_quit(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;err_ret(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;err_sys(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;log_msg(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;{App&nbsp;misc_source}&nbsp;*/&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;log_open(const&nbsp;char&nbsp;*,&nbsp;int,&nbsp;int);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;log_quit(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;log_ret(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;log_sys(const&nbsp;char&nbsp;*,&nbsp;...);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;TELL_WAIT(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;parent/child&nbsp;from&nbsp;{Sec&nbsp;race_condition&nbsp;&nbsp;<BR>}&nbsp;*/&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;TELL_PARENT(pid_t);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;TELL_CHILD(pid_t);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;WAIT_PARENT(void);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;WAIT_CHILD(void);&nbsp;&nbsp;<BR>#endif&nbsp;&nbsp;/*&nbsp;__ourhdr_h&nbsp;*/&nbsp;&nbsp;<BR>程序B.1&nbsp;我们的头文件ourhdr.h&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在程序中先包括一般系统头文件,然后再包括ourhdr.h,这样就能解决某些系统&nbsp;&nbsp;<BR>之间的差别(例如4.3BSDReno中没有定义SIG_ERR),并且也可定义一些我们的函&nbsp;&nbsp;<BR>数原型,而这些仅当包括一般系统头文件之后才是需要的。当尚未定义某个结构就&nbsp;&nbsp;<BR>在原型中引用该结构时,某些ANSI&nbsp;C编译会认为不正常。&nbsp;&nbsp;<BR>B.2&nbsp;标准出错处理例程&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们提供了两套出错处理例程,它们用于本书中大多数实例以处理各种出错情况&nbsp;&nbsp;<BR>。一套例程以err_开头,并向标准出错文件输出一条出错消息。另一套例程以log&nbsp;&nbsp;<BR>_开头,用于精灵进程(第十三章),它们多半没有控制终端。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;提供了这些出错处理函数后,只要在程序中写一行代码就可以进行出错处理,例&nbsp;&nbsp;<BR>如:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(出错条件)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_dump(带任意参数的printf格式);&nbsp;&nbsp;<BR>这样也就不再需要使用下列代码:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(出错条件)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;buff[200];&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(buff,&nbsp;带任意参数的printf格式);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(buff);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abort(&nbsp;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们的出错处理函数使用了ANSI&nbsp;C的变长参数表功能。其详细说明见Kernighan和&nbsp;&nbsp;<BR>Ritchie[1998]的7.3接。应当注意的是这一ANSI&nbsp;C功能与较早系统(例如SVR3和4&nbsp;&nbsp;<BR>.3BSD)提供的varargs功能不同。宏的名字相同,但更改了某些宏的参数。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图B.1列出了各个出错处理函数之间的区别。&nbsp;&nbsp;<BR>Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strerror(errno)?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Teerminate?&nbsp;&nbsp;<BR>Err_ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>Err_sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);&nbsp;&nbsp;<BR>Err_dump&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abort();&nbsp;&nbsp;<BR>Err_msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>Err_quit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);&nbsp;&nbsp;<BR>Log_ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>Log_sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(2);&nbsp;&nbsp;<BR>Log_msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(出错条件)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_dump(带任意参数的printf格式);&nbsp;&nbsp;<BR>这样也就不再需要使用下列代码:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(出错条件)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;buff[200];&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(buff,&nbsp;带任意参数的printf格式);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(buff);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abort(&nbsp;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们的出错处理函数使用了ANSI&nbsp;C的变长参数表功能。其详细说明见Kernighan和&nbsp;&nbsp;<BR>Ritchie[1998]的7.3接。应当注意的是这一ANSI&nbsp;C功能与较早系统(例如SVR3和4&nbsp;&nbsp;<BR>.3BSD)提供的varargs功能不同。宏的名字相同,但更改了某些宏的参数。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图B.1列出了各个出错处理函数之间的区别。&nbsp;&nbsp;<BR>Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strerror(errno)?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Teerminate?&nbsp;&nbsp;<BR>Err_ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>Err_sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);&nbsp;&nbsp;<BR>Err_dump&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abort();&nbsp;&nbsp;<BR>Err_msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>Err_quit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);&nbsp;&nbsp;<BR>Log_ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>Log_sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(2);&nbsp;&nbsp;<BR>Log_msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>Log_quit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(2);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>图B.1&nbsp;&nbsp;我们的标准出错处理函数&nbsp;&nbsp;<BR>程序B.2包括了输出至标准出错文件的各个出错处理函数。&nbsp;&nbsp;<BR>#include&nbsp;&lt;errno.h&gt;&nbsp;&nbsp;/*&nbsp;for&nbsp;definition&nbsp;of&nbsp;errno&nbsp;*/&nbsp;&nbsp;<BR>#include&nbsp;&lt;stdarg.h&gt;&nbsp;&nbsp;/*&nbsp;ANSI&nbsp;C&nbsp;header&nbsp;file&nbsp;*/&nbsp;&nbsp;<BR>#include&nbsp;&quot;ourhdr.h&quot;&nbsp;&nbsp;<BR>static&nbsp;void&nbsp;err_doit(int,&nbsp;const&nbsp;char&nbsp;*,&nbsp;va_list);&nbsp;&nbsp;<BR>char&nbsp;*pname&nbsp;=&nbsp;NULL;&nbsp;&nbsp;/*&nbsp;caller&nbsp;can&nbsp;set&nbsp;this&nbsp;from&nbsp;argv[0]&nbsp;*/&nbsp;&nbsp;<BR>/*&nbsp;Nonfatal&nbsp;error&nbsp;related&nbsp;to&nbsp;a&nbsp;system&nbsp;call.&nbsp;&nbsp;<BR>&nbsp;*&nbsp;Print&nbsp;a&nbsp;message&nbsp;and&nbsp;return.&nbsp;*/&nbsp;&nbsp;<BR>void&nbsp;&nbsp;<BR>err_ret(const&nbsp;char&nbsp;*fmt,&nbsp;...)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;va_list&nbsp;&nbsp;ap;&nbsp;&nbsp;<BR>&nbsp;va_start(ap,&nbsp;fmt);&nbsp;&nbsp;<BR>&nbsp;err_doit(1,&nbsp;fmt,&nbsp;ap);&nbsp;&nbsp;<BR>&nbsp;va_end(ap);&nbsp;&nbsp;<BR>&nbsp;return;&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>/*&nbsp;Fatal&nbsp;error&nbsp;related&nbsp;to&nbsp;a&nbsp;system&nbsp;call.&nbsp;&nbsp;<BR>&nbsp;*&nbsp;Print&nbsp;a&nbsp;message&nbsp;and&nbsp;terminate.&nbsp;*/&nbsp;&nbsp;<BR>void&nbsp;&nbsp;<BR>err_sys(const&nbsp;char&nbsp;*fmt,&nbsp;...)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;va_list&nbsp;&nbsp;ap;&nbsp;&nbsp;<BR>&nbsp;va_start(ap,&nbsp;fmt);&nbsp;&nbsp;<BR>&nbsp;err_doit(1,&nbsp;fmt,&nbsp;ap);&nbsp;&nbsp;<BR>&nbsp;va_end(ap);&nbsp;&nbsp;<BR>&nbsp;exit(1);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>/*&nbsp;Fatal&nbsp;error&nbsp;related&nbsp;to&nbsp;a&nbsp;system&nbsp;call.&nbsp;&nbsp;<BR>&nbsp;*&nbsp;Print&nbsp;a&nbsp;message,&nbsp;dump&nbsp;core,&nbsp;and&nbsp;terminate.&nbsp;*/&nbsp;&nbsp;<BR>void&nbsp;&nbsp;<BR>err_dump(const&nbsp;char&nbsp;*fmt,&nbsp;...)&nbsp;&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -