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

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

?? 14.htm

?? UNIX環境下C編程的詳細詳細介紹
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
<p>考慮一個應用程序,它向標準輸出寫一個提示,然后從標準輸入讀1行。使用pope 
</p>

<p>n,我們可以在應用程序和輸入之間插入一道程序以對輸入進行變換處理。圖14.8顯 
</p>

<p>示了進程的安排。 </p>

<p>圖14.8 用popen變換輸入 </p>

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

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

<p>int </p>

<p>main(void) </p>

<p>{ </p>

<p>int c; </p>

<p>while ( (c = getchar()) != EOF) { </p>

<p>if (isupper(c)) </p>

<p>c = tolower(c); </p>

<p>if (putchar(c) == EOF) </p>

<p>err_sys(&quot;output error&quot;); </p>

<p>if (c == '\n') </p>

<p>fflush(stdout); </p>

<p>} </p>

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

<p>} </p>

<p>程序14.6 過濾程序,將大寫字符變換成小寫字符 </p>

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

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

<p>int </p>

<p>main(void) </p>

<p>{ </p>

<p>char line[MAXLINE]; </p>

<p>FILE *fpin; </p>

<p>if ( (fpin = popen(&quot;myuclc&quot;, &quot;r&quot;)) == NULL) </p>

<p>err_sys(&quot;popen error&quot;); </p>

<p>for ( ; ; ) { </p>

<p>fputs(&quot;prompt&gt; &quot;, stdout); </p>

<p>fflush(stdout); </p>

<p>if (fgets(line, MAXLINE, fpin) == NULL) /* read from pipe */ </p>

<p>break; </p>

<p>if (fputs(line, stdout) == EOF) </p>

<p>err_sys(&quot;fputs error to pipe&quot;); </p>

<p>} </p>

<p>if (pclose(fpin) == -1) </p>

<p>err_sys(&quot;pclose error&quot;); </p>

<p>putchar('\n'); </p>

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

<p>} </p>

<p>程序14.7 調用大寫/小寫過濾程序以讀取命令 </p>

<p>對輸入進行的變換可能是路徑名的擴充,或者是提供一種歷史機制(記住以前輸入 
</p>

<p>的命令)。 </p>

<p>程序14.6是一個簡單的過濾程序,它只是將輸入復制到輸出,在復制時將任一大 
</p>

<p>寫字符變換為小寫字符。在寫了一行之后,我們對標準輸出進行了刷清(用fflus 
</p>

<p>h),其理由將在下一節介紹協同進程時討論。 </p>

<p>我們對該過濾程序進行編譯,其可執行目標代碼存放在文件myuclc中,然后在程序 
</p>

<p>14.7中用popen調用它們。 </p>

<p>因為標準輸出通常是按行進行緩沖的,而提示并不包含新行符,所以在寫了提示之 
</p>

<p>后,需要調用fflush。 </p>

<p>14.4 協同進程 </p>

<p>Unix過濾程序從標準輸入讀取數據,對其進行適當處理后寫到標準輸出。幾個過濾 
</p>

<p>進程通常在shell管道命令中線性地連接。當同一道程序產生某個過濾程序的輸入 
</p>

<p>,同時又讀取該過濾程序的輸出時,則該過濾程序就成為協同進程。 
</p>

<p>KornShell提供了協同進程。Bourne shell和C shell并沒有提供將進程連接起來按 
</p>

<p>協同進程方式工作的方法。協同進程通常在shell的后臺運行,其標準輸入和標準 
</p>

<p>輸出通過管道連接到另一道程序。雖然要求初始化一個協同進程,并將其輸入和輸 
</p>

<p>出連接到另一個進程的shell語法是十分奇特的(詳細情況見Bolsky和Korn[1989] 
</p>

<p>中的pp.66-66),但是協同進程的工作方式在C程序中也是非常有用的。 
</p>

<p>popen提供連到另一個進程的標準輸入或標準輸出的一個單行管道,而對于協同進 
</p>

<p>程,則它有連到另一個進程的兩個單行管道--一個接到其標準輸入,另一個則來從 
</p>

<p>標準輸出開始。我們先要將數據寫到其標準輸入,經其處理后,再從其標準輸出讀 
</p>

<p>取數據。 </p>

<p>實例 </p>

<p>讓我們通過一個實例來觀察協同進程。進程先創建兩個管道:一個是協同進程的標 
</p>

<p>準輸入,另一個是協同進程的標準輸出。圖14.9顯示了這種安排。 </p>

<p>圖14.9 驅動一個協同進程--寫其標準輸入,讀其標準輸出 </p>

<p>程序14.8是一個簡單的協同進程,它從其標準輸入讀兩個數,計算它們的和,然后 
</p>

<p>將結果寫至標準輸出。 </p>

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

<p>int </p>

<p>main(void) </p>

<p>{ </p>

<p>int n, int1, int2; </p>

<p>char line[MAXLINE]; </p>

<p>while ( (n = read(STDIN_FILENO, line, MAXLINE)) &gt; 0) { </p>

<p>line[n] = 0; /* null terminate */ </p>

<p>if (sscanf(line, &quot;%d%d&quot;, &amp;int1, &amp;int2) == 2) { </p>

<p>sprintf(line, &quot;%d\n&quot;, int1 + int2); </p>

<p>n = strlen(line); </p>

<p>if (write(STDOUT_FILENO, line, n) != n) </p>

<p>err_sys(&quot;write error&quot;); </p>

<p>} else { </p>

<p>if (write(STDOUT_FILENO, &quot;invalid args\n&quot;, 13) != 13) </p>

<p>err_sys(&quot;write error&quot;); </p>

<p>} </p>

<p>} </p>

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

<p>} </p>

<p>程序14.8 加兩個數的簡單濾波器 </p>

<p>對此程序進行編譯,將其可執行目標代碼存入名為add2的文件。 </p>

<p>程序14.9在從其標準輸入讀入兩個數之后調用add2協同進程。從協同進程送來的值 
</p>

<p>則寫到其標準輸出。 </p>

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

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

<p>static void sig_pipe(int); /* our signal handler */ </p>

<p>int </p>

<p>main(void) </p>

<p>{ </p>

<p>int n, fd1[2], fd2[2]; </p>

<p>pid_t pid; </p>

<p>char line[MAXLINE]; </p>

<p>if (signal(SIGPIPE, sig_pipe) == SIG_ERR) </p>

<p>err_sys(&quot;signal error&quot;); </p>

<p>if (pipe(fd1) &lt; 0 || pipe(fd2) &lt; 0) </p>

<p>err_sys(&quot;pipe error&quot;); </p>

<p>if ( (pid = fork()) &lt; 0) </p>

<p>err_sys(&quot;fork error&quot;); </p>

<p>else if (pid &gt; 0) { /* parent */ </p>

<p>close(fd1[0]); </p>

<p>close(fd2[1]); </p>

<p>while (fgets(line, MAXLINE, stdin) != NULL) { </p>

<p>n = strlen(line); </p>

<p>if (write(fd1[1], line, n) != n) </p>

<p>err_sys(&quot;write error to pipe&quot;); </p>

<p>if ( (n = read(fd2[0], line, MAXLINE)) &lt; 0) </p>

<p>err_sys(&quot;read error from pipe&quot;); </p>

<p>if (n == 0) { </p>

<p>err_msg(&quot;child closed pipe&quot;); </p>

<p>break; </p>

<p>} </p>

<p>line[n] = 0; /* null terminate */ </p>

<p>if (fputs(line, stdout) == EOF) </p>

<p>err_sys(&quot;fputs error&quot;); </p>

<p>} </p>

<p>if (ferror(stdin)) </p>

<p>err_sys(&quot;fgets error on stdin&quot;); </p>

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

<p>} else { /* child */ </p>

<p>close(fd1[1]); </p>

<p>close(fd2[0]); </p>

<p>if (fd1[0] != STDIN_FILENO) { </p>

<p>if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO) </p>

<p>err_sys(&quot;dup2 error to stdin&quot;); </p>

<p>close(fd1[0]); </p>

<p>} </p>

<p>if (fd2[1] != STDOUT_FILENO) { </p>

<p>if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO) </p>

<p>err_sys(&quot;dup2 error to stdout&quot;); </p>

<p>close(fd2[1]); </p>

<p>} </p>

<p>if (execl(&quot;./add2&quot;, &quot;add2&quot;, (char *) 0) &lt; 0) </p>

<p>err_sys(&quot;execl error&quot;); </p>

<p>} </p>

<p>} </p>

<p>static void </p>

<p>sig_pipe(int signo) </p>

<p>{ </p>

<p>printf(&quot;SIGPIPE caught\n&quot;); </p>

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

<p>} </p>

<p>程序14.9 驅動add2過濾程序的程序 </p>

<p>在程序中創建了兩個管道,父、子進程各自關閉它們不需使用的端口。創建兩個管 
</p>

<p>道的理由是;一個用作為協同進程的標準輸入,另一個則用作為它的標準輸出。然 
</p>

<p>后在調用execl之前,子進程調用dup2使管道描述符移至其標準輸入和輸出。 
</p>

<p>若編譯和運行程序14.9,它如所希望的那樣進行工作。進一步考慮,在程序14.9正 
</p>

<p>等待我們的輸入時,若kill add2協同進程;然后輸入兩個數;當程序14.9對管道 
</p>

<p>進行寫操作時,由于該管道無讀進程,于是調用信號處理程序(見練習14.4)。 
</p>

<p>在程序15.1中,我們將提供這一實例的另一個版本,它使用一個全雙工管道而不是 
</p>

<p>兩個半雙工管道。 </p>

<p>實例 </p>

<p>在協同進程add2(程序14.8)中,我們使用了Unix I/O:read和write。如果我們使 
</p>

<p>用標準I/O改寫該協同進程,其后果是什么呢?程序14.10就是這個新版本。 
</p>

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

<p>int </p>

<p>main(void) </p>

<p>{ </p>

<p>int int1, int2; </p>

<p>char line[MAXLINE]; </p>

<p>while (fgets(line, MAXLINE, stdin) != NULL) { </p>

<p>if (sscanf(line, &quot;%d%d&quot;, &amp;int1, &amp;int2) == 2) { </p>

<p>if (printf(&quot;%d\n&quot;, int1 + int2) == EOF) </p>

<p>err_sys(&quot;printf error&quot;); </p>

<p>} else { </p>

<p>if (printf(&quot;invalid args\n&quot;) == EOF) </p>

<p>err_sys(&quot;printf error&quot;); </p>

<p>} </p>

<p>} </p>

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

<p>} </p>

<p>程序14.10 加兩個數的濾波器,使用標準I/O </p>

<p>若程序14.9調用此新的協同進程,則它就不再工作。問題出在系統默認的標準I/O 
</p>

<p>緩存機制上。當程序14.10被調用時,對標準輸入的第一個fgets引起標準I/O庫分 
</p>

<p>配一個緩存,并選擇緩存的類型。因為標準輸入是個管道,所以isatty為假,于是 
</p>

<p>標準I/O庫由系統默認是全緩沖的。對標準輸出也有同樣的處理。當add2從其標準 
</p>

<p>輸入讀取而發生堵塞時,程序14.9在從管道讀時也發生堵塞,于是產生了死鎖。 
</p>

<p>我們對將要執行(exec)的這樣一個協同進程可以加以控制。在程序14.10中的wh 
</p>

<p>ile循環之前加上下面4行。 </p>

<p>if ( setvbuf(stdin ,NULL, _IOLBF, O) !=0 ) </p>

<p>err_sys(&quot;setvbuf error&quot;); </p>

<p>if ( setvbuf(stdout,NULL,_IOLBF,O)!=0 ) </p>

<p>err_sys(&quot;setvbuf error&quot;); </p>

<p>這使得當有一行可用時,fgets即返回,使得當輸出一新行符時,printf即執行ff 
</p>

<p>lush操作。對setvbuf進行了這些顯式調用,使得程序14.10能正常工作。 
</p>

<p>如果我們不能修改這樣的協同進程,則需使用其它技術。例如,如果在我們的程序 
</p>

<p>中使用awk(1)代替add2作為協同進程,則下列命令行不能工作; </p>

<p>#!/bin/awk/ -f </p>

<p>{print $1+$2} </p>

<p>不能工作的原因還是標準I/O的緩沖機制問題。但是,在這種情況下我們不能改變 
</p>

<p>awk的工作方式(除非我們有awk的源代碼)。 </p>

<p>對這種問題的一般解決方法是使被調用(在本例中是awk)的協同進程認為它的標 
</p>

<p>準輸入和輸出是連到一個終端。這使得在協同進程中的標準I/O例程對這兩個I/O流 
</p>

<p>進行行緩存,這類似于我們在前面所做的顯式setvbuf調用。在第十九章中,我們 
</p>

<p>將用偽終端實現這一點。 </p>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
五月婷婷欧美视频| 亚洲精品免费在线播放| 韩国毛片一区二区三区| 久久久久久久综合日本| 国产成人精品午夜视频免费| 久久久国产一区二区三区四区小说 | 欧美人狂配大交3d怪物一区| 亚洲大型综合色站| 日韩你懂的电影在线观看| 国产一区二区三区精品视频| 中文字幕在线观看不卡视频| 91福利国产精品| 美女久久久精品| 国产三级精品视频| 欧美中文字幕不卡| 精品一区二区免费看| 亚洲国产成人在线| 在线观看亚洲精品视频| 日韩国产在线一| 久久久www成人免费无遮挡大片| 99精品1区2区| 蜜芽一区二区三区| 亚洲视频一区二区在线| 欧美一三区三区四区免费在线看| 久久99国产精品尤物| 亚洲人成人一区二区在线观看| 欧美日韩性生活| 成人性生交大片免费看在线播放| 亚洲激情中文1区| 久久久久国产一区二区三区四区| 在线国产电影不卡| 国产精品香蕉一区二区三区| 亚洲精品高清在线| 久久蜜桃av一区二区天堂| 日本久久电影网| 国产乱理伦片在线观看夜一区| 亚洲国产综合人成综合网站| 国产亚洲精品久| 欧美二区在线观看| 色婷婷久久久久swag精品 | 成人免费黄色大片| 看片的网站亚洲| 亚洲六月丁香色婷婷综合久久 | 欧美v亚洲v综合ⅴ国产v| 色综合一区二区三区| 国产在线精品一区二区三区不卡| 一卡二卡欧美日韩| 国产精品三级视频| 久久久久久电影| 欧美一区二区私人影院日本| 91色在线porny| 风间由美性色一区二区三区| 欧美a级理论片| 午夜精品一区二区三区三上悠亚| 综合电影一区二区三区| 欧美大片一区二区三区| 欧美撒尿777hd撒尿| 一本大道久久a久久综合| 国产精品一色哟哟哟| 蜜臀av一区二区| 日韩国产欧美一区二区三区| 亚洲一本大道在线| 亚洲综合一区二区三区| 最新热久久免费视频| 中文在线资源观看网站视频免费不卡| 精品国产亚洲一区二区三区在线观看| 制服丝袜激情欧洲亚洲| 欧美欧美午夜aⅴ在线观看| 欧美影视一区二区三区| 欧美亚洲丝袜传媒另类| 在线视频综合导航| 欧洲一区二区三区在线| av在线一区二区三区| caoporen国产精品视频| 成人午夜电影小说| 丰满少妇久久久久久久| 成人听书哪个软件好| 成人免费观看男女羞羞视频| 成人av电影在线网| caoporen国产精品视频| 色悠悠亚洲一区二区| 欧美色综合影院| 欧美精品一级二级三级| 欧美一区二区三区四区高清| 欧美一区二区观看视频| 精品国产电影一区二区| 国产三级精品视频| 亚洲色图在线视频| 一级中文字幕一区二区| 日韩成人一区二区三区在线观看| 日本在线不卡视频| 久热成人在线视频| 国产成人aaa| 99久久精品免费看| 欧美性三三影院| 精品国产一区二区三区忘忧草| 国产免费观看久久| 亚洲制服丝袜一区| 蜜桃av一区二区在线观看| 精品一二线国产| 99久久99久久精品免费观看| 欧美日韩免费一区二区三区视频| 欧美一区二区视频在线观看2020 | 丁香激情综合国产| 91麻豆福利精品推荐| 91精品欧美综合在线观看最新| 精品国产露脸精彩对白 | 久久蜜桃av一区二区天堂| 国产精品入口麻豆原神| 亚洲图片欧美综合| 狠狠色丁香久久婷婷综合丁香| 不卡视频一二三四| 欧美精选一区二区| 国产情人综合久久777777| 亚洲高清免费在线| 国产寡妇亲子伦一区二区| 色吧成人激情小说| 欧美精品一区二区三区蜜臀| 成人欧美一区二区三区视频网页| 亚洲成人手机在线| 成人一区在线观看| 7777精品久久久大香线蕉| 国产亚洲va综合人人澡精品| 亚洲一区二区偷拍精品| 国产在线视频一区二区| 欧美日韩精品系列| 国产精品妹子av| 久久国内精品视频| 91福利在线导航| 国产精品蜜臀在线观看| 蜜臀99久久精品久久久久久软件| av在线一区二区三区| 精品乱人伦一区二区三区| 伊人夜夜躁av伊人久久| 粉嫩av一区二区三区| 91精品国产手机| 亚洲一级二级在线| 9色porny自拍视频一区二区| 亚洲精品在线电影| 日韩av不卡在线观看| 欧美艳星brazzers| 亚洲美腿欧美偷拍| 国产成人av网站| 欧美不卡一区二区| 日精品一区二区| 在线欧美日韩国产| 综合久久久久久| 大桥未久av一区二区三区中文| 精品国产一区二区精华| 日本午夜精品一区二区三区电影| 91精品91久久久中77777| 亚洲欧洲av色图| 成人av电影在线观看| 国产网红主播福利一区二区| 精品一二三四区| 欧美成人午夜电影| 久久99国内精品| 欧美精品一区二区在线播放| 另类小说视频一区二区| 91精品国产色综合久久| 亚洲成人资源网| 777奇米四色成人影色区| 亚洲国产一区在线观看| 欧美日韩一区二区欧美激情| 亚洲午夜精品17c| 欧美久久一二区| 日韩电影免费在线观看网站| 欧美一区二区三区免费大片| 日韩精品1区2区3区| 制服丝袜av成人在线看| 免费成人av在线| 日韩女优视频免费观看| 国产资源在线一区| 久久老女人爱爱| av亚洲精华国产精华精| 国产精品成人在线观看| 色综合天天狠狠| 午夜精品在线看| 欧美xfplay| 风间由美中文字幕在线看视频国产欧美 | 国产午夜精品一区二区三区视频| 风间由美一区二区av101| 亚洲人成影院在线观看| 欧美午夜不卡视频| 日本视频在线一区| 精品人在线二区三区| 国产成人av电影在线观看| 日韩美女视频一区二区| 欧美日韩在线不卡| 美洲天堂一区二卡三卡四卡视频| 精品国产精品一区二区夜夜嗨| 成人国产精品免费观看动漫| 亚洲午夜久久久久久久久电影院| 欧美日韩国产精品自在自线| 狠狠色综合日日| 一区二区三区在线观看国产| 91麻豆精品国产自产在线观看一区 | 国产资源在线一区| 亚洲欧洲三级电影| 欧美一级理论片|