亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 17.htm

?? UNIX環境下C編程的詳細詳細介紹
?? HTM
?? 第 1 頁 / 共 4 頁
字號:
</p>

<p>入可以是打印機狀態消息或者給用戶的輸出。 </p>

<p>_______________________________________________________________________ </p>

<p>______ </p>

<p>#include &quot;lprps.h&quot; </p>

<p>static int eof_count; </p>

<p>static int ignore_input; </p>

<p>static enum parse_state { /* state of parsing input from printer */ </p>

<p>NORMAL, </p>

<p>HAD_ONE_PERCENT, </p>

<p>HAD_TWO_PERCENT, </p>

<p>IN_MESSAGE, </p>

<p>HAD_RIGHT_BRACKET, </p>

<p>HAD_RIGHT_BRACKET_AND_PERCENT </p>

<p>} parse_state; </p>

<p>/* Initialize our input machine. */ </p>

<p>void </p>

<p>init_input(int job) </p>

<p>{ </p>

<p>in_job = job; /* only true when send_file() calls us */ </p>

<p>parse_state = NORMAL; </p>

<p>ignore_input = 0; </p>

<p>} </p>

<p>/* Read from the printer until we encounter an EOF. </p>

<p>* Whether or not the input is processed depends on &quot;ignore&quot;. */ </p>

<p>void </p>

<p>proc_upto_eof(int ignore) </p>

<p>{ </p>

<p>int ec; </p>

<p>ignore_input = ignore; </p>

<p>ec = eof_count; /* proc_input_char() increments eof_count */ </p>

<p>while (ec == eof_count) </p>

<p>proc_some_input(); </p>

<p>} </p>

<p>/* Wait for some data then read it. </p>

<p>* Call proc_input_char() for every character read. */ </p>

<p>void </p>

<p>proc_some_input(void) </p>

<p>{ </p>

<p>char ibuf[IBSIZE]; </p>

<p>char *ptr; </p>

<p>int nread; </p>

<p>fd_set rfds; </p>

<p>FD_ZERO(&amp;rfds); </p>

<p>FD_SET(psfd, &amp;rfds); </p>

<p>set_nonblock(); </p>

<p>if (intr_flag) </p>

<p>handle_intr(); </p>

<p>if (alrm_flag) </p>

<p>handle_alrm(); </p>

<p>while (select(psfd + 1, &amp;rfds, NULL, NULL, NULL) &lt; 0) { </p>

<p>if (errno == EINTR) { </p>

<p>if (alrm_flag) </p>

<p>handle_alrm(); /* doesn't return */ </p>

<p>else if (intr_flag) </p>

<p>handle_intr(); /* doesn't return */ </p>

<p>} else </p>

<p>log_sys(&quot;proc_some_input: select error&quot;); </p>

<p>} </p>

<p>if ( (nread = read(psfd, ibuf, IBSIZE)) &lt; 0) </p>

<p>log_sys(&quot;proc_some_input: read error&quot;); </p>

<p>else if (nread == 0) </p>

<p>log_sys(&quot;proc_some_input: read returned 0&quot;); </p>

<p>ptr = ibuf; </p>

<p>while (--nread &gt;= 0) </p>

<p>proc_input_char(*ptr++); /* process each character */ </p>

<p>} </p>

<p>/* Called by proc_some_input() above after some input has been read. </p>

<p>* Also called by out_buf() whenever asynchronous input appears. */ </p>

<p>void </p>

<p>proc_input_char(int c) </p>

<p>{ </p>

<p>if (c == '\004') { </p>

<p>eof_count++; /* just count the EOFs */ </p>

<p>return; </p>

<p>} else if (ignore_input) </p>

<p>return; /* ignore everything except EOFs */ </p>

<p>switch (parse_state) { /* parse the input */ </p>

<p>case NORMAL: </p>

<p>if (c == '%') </p>

<p>parse_state = HAD_ONE_PERCENT; </p>

<p>else </p>

<p>mail_char(c); </p>

<p>break; </p>

<p>case HAD_ONE_PERCENT: </p>

<p>if (c == '%') </p>

<p>parse_state = HAD_TWO_PERCENT; </p>

<p>else { </p>

<p>mail_char('%'); mail_char(c); </p>

<p>parse_state = NORMAL; </p>

<p>} </p>

<p>break; </p>

<p>case HAD_TWO_PERCENT: </p>

<p>if (c == '[') { </p>

<p>msg_init(); /* message starting; init buffer */ </p>

<p>parse_state = IN_MESSAGE; </p>

<p>} else { </p>

<p>mail_char('%'); mail_char('%'); mail_char(c); </p>

<p>parse_state = NORMAL; </p>

<p>} </p>

<p>break; </p>

<p>case IN_MESSAGE: </p>

<p>if (c == ']') </p>

<p>parse_state = HAD_RIGHT_BRACKET; </p>

<p>else </p>

<p>msg_char(c); </p>

<p>break; </p>

<p>case HAD_RIGHT_BRACKET: </p>

<p>if (c == '%') </p>

<p>parse_state = HAD_RIGHT_BRACKET_AND_PERCENT; </p>

<p>else { </p>

<p>msg_char(']'); msg_char(c); </p>

<p>parse_state = IN_MESSAGE; </p>

<p>} </p>

<p>break; </p>

<p>case HAD_RIGHT_BRACKET_AND_PERCENT: </p>

<p>if (c == '%') { </p>

<p>parse_state = NORMAL; </p>

<p>proc_msg(); /* we have a message; process it */ </p>

<p>} else { </p>

<p>msg_char(']'); msg_char('%'); msg_char(c); </p>

<p>parse_state = IN_MESSAGE; </p>

<p>} </p>

<p>break; </p>

<p>default: </p>

<p>abort(); </p>

<p>} </p>

<p>} </p>

<p>_______________________________________________________________________ </p>

<p>______ </p>

<p>程序17.13 input.c文件-讀取和處理從打印機的輸入 </p>

<p>每當我們等待從打印機返回EOF時就會調用函數proc_upto_eof。 </p>

<p>函數proc_some_input從串口讀取。注意我們調用select 
函數來確定什么時候 </p>

<p>該描述符是可以讀取的。這是因為select 
函數通常被一個捕捉到的信號所中斷-它 </p>

<p>并不自動地重啟動。因為select 函數能被SIGALRM或SIGINT所中斷,我們并不希望 
</p>

<p>它重啟動。回憶一下在12.5節中我們關于select函數被正常中斷的討論。同樣回憶 
</p>

<p>在10.5節中我們設置SA_RESTART來說明當一個特定信號出現時,應當自動重啟動的 
</p>

<p>I/O函數。但是因為并不總是有一個附加的標志,使得我們可以說明I/O 
函數不應 </p>

<p>當重啟動。如果不設置SA_RESTART,我們只能倚賴系統的缺省值,而這可能是自動 
</p>

<p>重新啟動被中斷的I/O函數。當從打印機返回輸入時,我們以非阻塞模式讀取,得 
</p>

<p>到打印機準備就緒的數據。然后調用函數proc_input_char來處理每一個字符。 
</p>

<p>處理打印機發送給我們的消息是由proc_input_char完成的。我們必須檢查每 
</p>

<p>一個字符并記住我們的狀態。變量parse_state跟蹤記錄當前狀態。調用msg_char 
</p>

<p>函數把序列%%[以后所有的字符串儲存在消息緩沖中。當遇到結束序列]%%時,我們 
</p>

<p>調用proc_msg來處理消息。除了開始%%[ 和最后 ]%%序列以及二者之間的狀態消息 
</p>

<p>其他字符串,都被認為是用戶的輸出,被郵遞給用戶(調用mail_char)。 
</p>

<p>我們現在查看那些處理由輸入函數積累消息的函數。程序17.14是文件messag 
</p>

<p>e.c。 </p>

<p>當檢測到%%[ 后,調用函數msg_init。它只是初始化緩沖計數器。然后對于消 
</p>

<p>息中的每一個字符都調用msg_char函數。 </p>

<p>函數proc_msg將消息分解為key:val對(關鍵字:值對),并檢查key。調用A 
</p>

<p>NSI C的strtok函數將消息分解為記號,每個key: val對用分號分隔。 </p>

<p>一個以下形式的消息 </p>

<p>%%[ Flushing : rest of job (to end-of-fiel) will be ignored ]%% </p>

<p>引起函數printer_flushing 被調用。它清理終端的緩沖,發送一個EOF給打印 
</p>

<p>機,然后等待打印機返回一個EOF。 </p>

<p>如果收到一個以下形式的消息 </p>

<p>%%[ PrinterError: reason]%% </p>

<p>就調用log_msg函數來記錄這個錯誤。帶有Error Key的出錯消息郵遞傳送回用 
</p>

<p>戶。這些一般是PostScript程序的錯誤。 </p>

<p>如果返回一個帶有關鍵字status的狀態消息,它很可能是由于函數get_statu 
</p>

<p>s發送給打印機一個狀態請求(Control-T)而引起的。我們查看val,并按照它來 
</p>

<p>設置變量status。 </p>

<p>_______________________________________________________________________ </p>

<p>______ </p>

<p>#include &quot;lprps.h&quot; </p>

<p>#include &lt;ctype.h&gt; </p>

<p>static char msgbuf[MBSIZE]; </p>

<p>static int msgcnt; </p>

<p>static void printer_flushing(void); </p>

<p>/* Called by proc_input_char() after it's seen the &quot;%%[&quot; that </p>

<p>* starts a message. */ </p>

<p>void </p>

<p>msg_init(void) </p>

<p>{ </p>

<p>msgcnt = 0; /* count of chars in message buffer */ </p>

<p>} </p>

<p>/* All characters received from the printer between the starting </p>

<p>* %%[ and the terminating ]%% are placed into the message buffer </p>

<p>* by proc_some_input(). This message will be examined by </p>

<p>* proc_msg() below. */ </p>

<p>void </p>

<p>msg_char(int c) </p>

<p>{ </p>

<p>if (c != '\0' &amp;&amp; msgcnt &lt; MBSIZE - 1) </p>

<p>msgbuf[msgcnt++] = c; </p>

<p>} </p>

<p>/* This function is called by proc_input_char() only after the final </p>

<p>* percent in a &quot;%%[ &lt;message&gt; ]%%&quot; has been seen. It parses the </p>

<p>* &lt;message&gt;, which consists of one or more &quot;key: val&quot; pairs. </p>

<p>* If there are multiple pairs, &quot;val&quot; can end in a semicolon. */ </p>

<p>void </p>

<p>proc_msg(void) </p>

<p>{ </p>

<p>char *ptr, *key, *val; </p>

<p>int n; </p>

<p>msgbuf[msgcnt] = 0; /* null terminate message */ </p>

<p>for (ptr = strtok(msgbuf, &quot;;&quot;); ptr != NULL; </p>

<p>ptr = strtok(NULL, &quot;;&quot;)) { </p>

<p>while (isspace(*ptr)) </p>

<p>ptr++; /* skip leading spaces in key */ </p>

<p>key = ptr; </p>

<p>if ( (ptr = strchr(ptr, ':')) == NULL) </p>

<p>continue; /* missing colon, something wrong, ignore */ </p>

<p>*ptr++ = '\0'; /* null terminate key (overwrite colon) */ </p>

<p>while (isspace(*ptr)) </p>

<p>ptr++; /* skip leading spaces in val */ </p>

<p>val = ptr; </p>

<p>/* remove trailing spaces in val */ </p>

<p>ptr = strchr(val, '\0'); </p>

<p>while (ptr &gt; val &amp;&amp; isspace(ptr[-1])) </p>

<p>--ptr; </p>

<p>*ptr = '\0'; </p>

<p>if (strcmp(key, &quot;Flushing&quot;) == 0) { </p>

<p>printer_flushing(); /* never returns */ </p>

<p>} else if (strcmp(key, &quot;PrinterError&quot;) == 0) { </p>

<p>log_msg(&quot;proc_msg: printer error: %s&quot;, val); </p>

<p>} else if (strcmp(key, &quot;Error&quot;) == 0) { </p>

<p>mail_line(&quot;Your PostScript printer job &quot; </p>

<p>&quot;produced the error `%s'.\n&quot;, val); </p>

<p>} else if (strcmp(key, &quot;status&quot;) == 0) { </p>

<p>if (strcmp(val, &quot;idle&quot;) == 0) </p>

<p>status = IDLE; </p>

<p>else if (strcmp(val, &quot;busy&quot;) == 0) </p>

<p>status = BUSY; </p>

<p>else if (strcmp(val, &quot;waiting&quot;) == 0) </p>

<p>status = WAITING; </p>

<p>else </p>

<p>status = UNKNOWN; /* &quot;printing&quot;, &quot;PrinterError&quot;, </p>

<p>&quot;initializing&quot;, or &quot;printing test page&quot;. */ </p>

<p>} else if (strcmp(key, &quot;OffendingCommand&quot;) == 0) { </p>

<p>mail_line(&quot;The offending command was `%s'.\n&quot;, val); </p>

<p>} else if (strcmp(key, &quot;pagecount&quot;) == 0) { </p>

<p>if (sscanf(val, &quot;%d&quot;, &amp;n) == 1 &amp;&amp; n &gt;= 0) { </p>

<p>if (start_page &lt; 0) </p>

<p>start_page = n; </p>

<p>else </p>

<p>end_page = n; </p>

<p>} </p>

<p>} </p>

<p>} </p>

<p>} </p>

<p>/* Called only by proc_msg() when the &quot;Flushing&quot; message </p>

<p>* is received from the printer. We exit. */ </p>

<p>static void </p>

<p>printer_flushing(void) </p>

<p>{ </p>

<p>clear_intr(); /* don't catch SIGINT */ </p>

<p>tty_flush(); /* empty tty input and output queues */ </p>

<p>block_write(&amp;eofc, 1); /* send an EOF to the printer */ </p>

<p>proc_upto_eof(1); /* this call won't be recursive, </p>

<p>since we specify to ignore input */ </p>

<p>get_page(&amp;end_page); </p>

<p>do_acct(); </p>

<p>exit(EXIT_SUCCESS); </p>

<p>} </p>

<p>_______________________________________________________________________ </p>

<p>______ </p>

<p>程序17.14 message.c文件,處理從打印機返回消息 </p>

<p>一個OffendingCommand的關鍵字一般總是與其它key : val對一起出現,如 </p>

<p>%% [ Error : stackunderflow ; OffendingCommand : pop ]%% </p>

<p>我們在送回給用戶的郵件中就要添加一行。 </p>

<p>最后,在函數get_page(程序17.9)中的PostScript程序產生一個頁面計數值 
</p>

<p>。我們調用sscanf把val轉換為二進制,設置起始或結束頁面值變量。函數get_pa 
</p>

<p>ge中的while循環就在等待這個變量變成非負值。 </p>

<p>17.5 摘要 </p>

<p>在這一章中實現一個完整的程序-它發送一個PostScript程序給連接在RS-232 
</p>

<p>端口的PostScript打印機。這給我們一個實踐機會,把前些章所介紹的很多函數用 
</p>

<p>到一個實用的程序中:例如I/O多路轉接、非阻塞的I/O、終端I/O和信號等。 
</p>

<p>習題: </p>

<p>17.1 我們需要使用lprps來打印標準輸入的文件,它也可能是一個管道。因為程序 
</p>

<p>psif一定要查看輸入文件的前兩個字節,那么應當如何開發psif程序(圖17.5)來 
</p>

<p>處理這種情況呢? </p>

<p>17.2 實現psif過濾器,處理前一個練習中的實例。 </p>

<p>17.3 參考12.5節中Adobe Systems[1998]關于在Postscript程序中字體請求的處理 
</p>

<p>,修改本章中的lprps程序以處理字體請求。 </p>

<p>-</font></p>
</body>
</html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂久久一区二区三区| 欧美日韩国产一级片| 色综合久久99| 久久这里只有精品6| 亚洲亚洲人成综合网络| 国产很黄免费观看久久| 538在线一区二区精品国产| 国产精品久久久久国产精品日日| 青青青伊人色综合久久| 91视频xxxx| 亚洲国产电影在线观看| 麻豆精品国产传媒mv男同| 欧美性色欧美a在线播放| 国产精品久久久久天堂| 国产很黄免费观看久久| www日韩大片| 久久福利资源站| 欧美美女黄视频| 精品亚洲成a人| 日韩视频123| 免费精品99久久国产综合精品| 欧美亚洲免费在线一区| 中文字幕视频一区| 国产91精品免费| 国产欧美一区二区在线| 国产伦精品一区二区三区免费 | 亚洲黄色av一区| 成人a级免费电影| 欧美国产亚洲另类动漫| 国产成人在线视频网站| 国产亚洲一二三区| 国产成人免费在线观看| 亚洲国产成人在线| 91婷婷韩国欧美一区二区| 日韩美女视频一区| 一本一本久久a久久精品综合麻豆| 亚洲欧洲www| 日本韩国一区二区三区| 亚洲国产美女搞黄色| 欧美日韩国产大片| 免费一级欧美片在线观看| 日韩欧美一区二区三区在线| 麻豆成人久久精品二区三区小说| 欧美大片在线观看一区二区| 国内久久精品视频| 国产亲近乱来精品视频| 91毛片在线观看| 肉肉av福利一精品导航| 日韩欧美一区二区三区在线| 国产成人精品网址| 亚洲人成7777| 日韩一区和二区| 成人性生交大片免费看中文| 综合网在线视频| 欧美日本国产视频| 国产成人免费高清| 亚洲精品成人少妇| 日韩你懂的电影在线观看| 国产成人精品免费一区二区| 亚洲精品一二三| 日韩欧美一区二区免费| 99免费精品在线| 免费日韩伦理电影| 国产精品久久久久久久久图文区 | 亚洲一二三区视频在线观看| 日韩精品最新网址| 99免费精品视频| 美女国产一区二区| 亚洲欧美另类图片小说| 日韩视频一区二区三区在线播放| 成人免费高清在线| 日韩av网站免费在线| 国产精品美女久久久久久久久| 在线电影院国产精品| 不卡的电影网站| 精品亚洲成av人在线观看| 亚洲制服丝袜av| 国产精品日韩精品欧美在线| 91精品国产91综合久久蜜臀| av一区二区三区在线| 极品美女销魂一区二区三区| 亚洲综合色噜噜狠狠| 国产日韩精品一区二区三区 | 亚洲国产精品99久久久久久久久 | 26uuu成人网一区二区三区| 99久久777色| 国产精品亚洲专一区二区三区 | 亚洲欧美日韩成人高清在线一区| 日韩欧美三级在线| 欧美综合一区二区| 成年人午夜久久久| 国产精品一区二区久久不卡| 色香蕉成人二区免费| 国产一区二区三区视频在线播放| 丝瓜av网站精品一区二区| 亚洲激情欧美激情| 国产精品久久毛片a| 国产欧美日韩在线观看| 精品日韩一区二区三区 | 日本精品裸体写真集在线观看 | 欧美精品粉嫩高潮一区二区| 色噜噜狠狠色综合中国| 成人精品国产福利| 国产不卡视频在线观看| 国产资源精品在线观看| 久久国产精品露脸对白| 美女网站在线免费欧美精品| 亚洲一区二区三区四区在线 | 国产精品乱码人人做人人爱| 久久久久久麻豆| 久久色在线观看| 久久先锋影音av鲁色资源网| 欧美va亚洲va| 欧美精品一区二区蜜臀亚洲| 精品福利一区二区三区免费视频| 日韩一区二区精品| 日韩欧美电影一二三| 日韩精品一区在线| 精品国产自在久精品国产| 精品入口麻豆88视频| 久久久久久9999| 国产欧美日韩视频一区二区| 中国av一区二区三区| 亚洲美女在线国产| 亚洲一级电影视频| 水野朝阳av一区二区三区| 美国三级日本三级久久99| 狠狠色丁香久久婷婷综合_中| 久久精品国产999大香线蕉| 国产麻豆日韩欧美久久| eeuss影院一区二区三区| 色综合久久精品| 欧美精品色综合| 精品乱码亚洲一区二区不卡| 国产欧美日本一区视频| 亚洲色图20p| 亚洲mv在线观看| 激情都市一区二区| 成人高清视频免费观看| 欧美日韩激情一区二区三区| 日韩欧美成人激情| 欧美极品美女视频| 亚洲一区二区三区激情| 久草这里只有精品视频| 成人一区二区三区视频在线观看| 日本韩国精品在线| 精品久久久久久无| 亚洲人成亚洲人成在线观看图片| 天天色天天操综合| 国产不卡在线视频| 欧美日韩久久一区二区| 国产亚洲短视频| 亚洲h动漫在线| 国产精品123| 欧美精品乱码久久久久久| 亚洲国产精华液网站w| 日韩制服丝袜av| 波多野结衣视频一区| 欧美一区二区三区在线视频| 国产精品成人在线观看| 麻豆成人久久精品二区三区红 | 日韩亚洲欧美在线| 国产精品久久午夜| 另类欧美日韩国产在线| 日本大香伊一区二区三区| 久久九九99视频| 日韩成人一区二区| 91国在线观看| 中国色在线观看另类| 九九精品视频在线看| 欧美日韩久久一区二区| 亚洲欧美日韩国产手机在线| 国产资源精品在线观看| 日韩一级大片在线| 亚洲一区二区高清| eeuss影院一区二区三区| 久久久亚洲国产美女国产盗摄 | 日韩一区二区三区精品视频| 亚洲激情在线播放| 成人av网址在线| 久久精品一区二区| 国产又黄又大久久| 日韩限制级电影在线观看| 午夜成人在线视频| 在线观看日产精品| 亚洲男人都懂的| 成人91在线观看| 国产精品国产三级国产aⅴ入口| 国产乱子伦视频一区二区三区 | 中文字幕一区三区| 成人av在线网站| 国产日韩视频一区二区三区| 国模娜娜一区二区三区| 538prom精品视频线放| 亚洲mv在线观看| 这里只有精品99re| 久久精品国产在热久久| 日韩一级大片在线观看| 久久疯狂做爰流白浆xx| 欧美精品一区二区在线观看|