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

📄 00000017.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;'\003';&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block_write(&amp;c,&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Control-C&nbsp;interrupts&nbsp;the&nbsp;PS&nbsp;job&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block_write(&amp;eofc,&nbsp;1);&nbsp;&nbsp;/*&nbsp;followed&nbsp;by&nbsp;EOF&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc_upto_eof(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;read&nbsp;&amp;&nbsp;ignore&nbsp;up&nbsp;through&nbsp;EOF&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clear_alrm();&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_page(&amp;end_page);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do_acct();&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;success&nbsp;since&nbsp;user&nbsp;lprm'ed&nbsp;the&nbsp;job&nbsp;*/&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>void&nbsp;&nbsp;<BR>set_intr(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;enable&nbsp;signal&nbsp;handler&nbsp;*/&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(signal_intr(SIGINT,&nbsp;sig_int)&nbsp;==&nbsp;SIG_ERR)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_sys(&quot;set_intr:&nbsp;signal_intr&nbsp;error&quot;);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>void&nbsp;&nbsp;<BR>clear_intr(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;ignore&nbsp;signal&nbsp;*/&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(signal(SIGINT,&nbsp;SIG_IGN)&nbsp;==&nbsp;SIG_ERR)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_sys(&quot;clear_intr:&nbsp;signal&nbsp;error&quot;);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>______&nbsp;&nbsp;<BR>程序17.6&nbsp;处理中断信号的interrupt.c文件&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;图17.6写明了哪些函数设置超时时间。我们只是在以下情况下设置超时:查询&nbsp;&nbsp;<BR>打印机状态(get_status)、读取打印机的页码(get_page)或者当我们正中断打印机&nbsp;&nbsp;<BR>时(handle_intr)。如果发生了超时,我们只需要记录下错误,过一段时间后终&nbsp;&nbsp;<BR>止。程序17.7是alarm.c文件。&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>______&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;lprps.h&quot;&nbsp;&nbsp;<BR>static&nbsp;void&nbsp;&nbsp;<BR>sig_alrm(int&nbsp;signo)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SIGALRM&nbsp;handler&nbsp;*/&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alrm_flag&nbsp;=&nbsp;1;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>void&nbsp;&nbsp;<BR>handle_alrm(void)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_ret(&quot;printer&nbsp;not&nbsp;responding&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(60);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;it&nbsp;will&nbsp;take&nbsp;at&nbsp;least&nbsp;this&nbsp;long&nbsp;to&nbsp;warm&nbsp;up&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_REPRINT);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Establish&nbsp;the&nbsp;signal&nbsp;handler&nbsp;and&nbsp;set&nbsp;the&nbsp;alarm.&nbsp;*/&nbsp;&nbsp;<BR>set_alrm(unsigned&nbsp;int&nbsp;nsec)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alrm_flag&nbsp;=&nbsp;0;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(signal_intr(SIGALRM,&nbsp;sig_alrm)&nbsp;==&nbsp;SIG_ERR)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_sys(&quot;set_alrm:&nbsp;signal_intr&nbsp;error&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alarm(nsec);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>void&nbsp;&nbsp;<BR>clear_alrm(void)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alarm(0);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(signal(SIGALRM,&nbsp;SIG_IGN)&nbsp;==&nbsp;SIG_ERR)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_sys(&quot;clear_alrm:&nbsp;signal&nbsp;error&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alrm_flag&nbsp;=&nbsp;0;&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>______&nbsp;&nbsp;<BR>程序17.7&nbsp;处理超时的alarm.c文件&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;程序17.8是函数get_status,这个函数由main函数调用。它发送一个Control&nbsp;&nbsp;<BR>-T到打印机以获取打印机的状态消息。打印机回送一行消息。如果我们接到的消息&nbsp;&nbsp;<BR>是:&nbsp;&nbsp;<BR>%%[&nbsp;status&nbsp;:&nbsp;idle]%%&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;这意味着打印机准备好执行一个新的作业。这个消息被函数proc_some_input&nbsp;&nbsp;<BR>读取和处理(下面我们会讨论这个函数)。&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>______&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;lprps.h&quot;&nbsp;&nbsp;<BR>/*&nbsp;Called&nbsp;by&nbsp;main()&nbsp;before&nbsp;printing&nbsp;job.&nbsp;&nbsp;<BR>&nbsp;*&nbsp;We&nbsp;send&nbsp;a&nbsp;Control-T&nbsp;to&nbsp;the&nbsp;printer&nbsp;to&nbsp;fetch&nbsp;its&nbsp;status.&nbsp;&nbsp;<BR>&nbsp;*&nbsp;If&nbsp;we&nbsp;timeout&nbsp;before&nbsp;reading&nbsp;the&nbsp;printer's&nbsp;status,&nbsp;something&nbsp;&nbsp;<BR>&nbsp;*&nbsp;is&nbsp;wrong.&nbsp;*/&nbsp;&nbsp;<BR>void&nbsp;&nbsp;<BR>get_status(void)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;c;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_alrm(5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;5&nbsp;second&nbsp;timeout&nbsp;to&nbsp;fetch&nbsp;status&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tty_flush();&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;'\024';&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block_write(&amp;c,&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;send&nbsp;Control-T&nbsp;to&nbsp;printer&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init_input(0);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(status&nbsp;==&nbsp;INVALID)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc_some_input();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;wait&nbsp;for&nbsp;something&nbsp;back&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(status)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;IDLE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;this&nbsp;is&nbsp;what&nbsp;we're&nbsp;looking&nbsp;for&nbsp;...&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clear_alrm();&nbsp;&nbsp;<BR>&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;case&nbsp;WAITING:&nbsp;&nbsp;&nbsp;/*&nbsp;printer&nbsp;thinks&nbsp;it's&nbsp;in&nbsp;the&nbsp;middle&nbsp;of&nbsp;a&nbsp;job&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block_write(&amp;eofc,&nbsp;1);&nbsp;&nbsp;/*&nbsp;send&nbsp;EOF&nbsp;to&nbsp;printer&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(5);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_REPRINT);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;BUSY:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;UNKNOWN:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(15);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_REPRINT);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>______&nbsp;&nbsp;<BR>程序17.8&nbsp;get_status函数&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;如果我们收到下列消息:&nbsp;&nbsp;<BR>%%[&nbsp;status:&nbsp;waiting&nbsp;]%%&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;这说明打印机正等待我们发送更多的数据以用于当前正打印的作业,这很可能&nbsp;&nbsp;<BR>是前一打印作业出了些问题。为了清除这个状态,我们发送给打印机一个EOF终止&nbsp;&nbsp;<BR>符。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PostScript打印机维护着一个页码计数器。这个计数器每打印一页就会增加,&nbsp;&nbsp;<BR>它即使在关闭电源时也会保存着。为了读此计数器,我们需要发送给打印机一个P&nbsp;&nbsp;<BR>ostScript程序。文件pagecount.c(程序17.9)包含了这个小PostScript程序(含&nbsp;&nbsp;<BR>有大约10个PostScript操作符)和函数get_page。&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>______&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;lprps.h&quot;&nbsp;&nbsp;<BR>/*&nbsp;PostScript&nbsp;program&nb

⌨️ 快捷键说明

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