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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 14.htm

?? UNIX環(huán)境下C編程的詳細(xì)詳細(xì)介紹
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>C:\WINDOWS\Desktop\UnixProg\7.htm</title>
</head>

<body>
<font SIZE="2">

<h1 align="center">第十四章; 進(jìn)程間通信 </h1>

<p>14.1 介紹 </p>

<p>在第八章中,我們說明了進(jìn)程控制原語并且觀察了如何調(diào)用多個進(jìn)程。但是這些進(jìn) 
</p>

<p>程之間交換信息的唯一方法是經(jīng)由fork或exec傳送打開文件,或通過文件系統(tǒng)。現(xiàn) 
</p>

<p>在,我們說明進(jìn)程之間相互通信的其它技術(shù)-IPC(interprocess 
communication) </p>

<p>。 </p>

<p>Unix IPC已經(jīng)是而且繼續(xù)是各種進(jìn)程通信方式的統(tǒng)稱,其中極少能在所有Unix的實(shí) 
</p>

<p>現(xiàn)中進(jìn)行移植。圖14.1摘要列出了不同實(shí)現(xiàn)所支持的不同形式的IPC。 
</p>

<p>圖14.1 UNIX IPC 摘要 </p>

<p>正如上圖所示,不管哪一種Unix實(shí)現(xiàn),我們都可依靠的唯一一種IPC是半雙工的管 
</p>

<p>道(pipes)。圖中前7種IPC通常限于同一臺主機(jī)的各個進(jìn)程間的IPC。最后二種; 
</p>

<p>套接口和流,是支持不同主機(jī)上各個進(jìn)程間IPC。(關(guān)于網(wǎng)絡(luò)IPC的詳細(xì)情況,請參 
</p>

<p>見Stevens[1990]。)雖然中間三種形式的IPC(消息隊列、信號量以及共享存儲器 
</p>

<p>)在圖中說明為只受到系統(tǒng)V的支持,但是在大多數(shù)制造商所支持的,從貝克萊Un 
</p>

<p>ix導(dǎo)出的Unix系統(tǒng)中(例如,SunOS以及Ultrix),已經(jīng)添加了這三種形式的IPC。 
</p>

<p>幾個Posix小組正在對IPC進(jìn)行工作,但是最后結(jié)果還不很清楚,在1994年 
</p>

<p>甚至 </p>

<p>更遲一點(diǎn)與IPC有關(guān)的Posix可能還不會制定出來。 </p>

<p>我們已將與IPC有關(guān)的討論分成兩章。在本章中,我們討論經(jīng)典的IPC;管道、FIF 
</p>

<p>O、消息隊列、信號量以及共享存儲器。在下一章中,我們將觀察SVR4和4.3+BSD共 
</p>

<p>同支持的IPC的某些高級特征,包括;流管道和命名的流管道,以及用這些更高級 
</p>

<p>形式IPC,我們可以做的一些事情。 </p>

<p>14.2 管道 </p>

<p>管道是Unix IPC的最老形式,并且所有Unix系統(tǒng)都提供此種通信機(jī)制,管道有兩種 
</p>

<p>限制; </p>

<p>1. 它們是半雙工的。數(shù)據(jù)只在一個方向流動。 </p>

<p>2. 
它們只能在具有公共祖先的進(jìn)程之間使用。通常,一個管道由一個進(jìn)程創(chuàng)建, 
</p>

<p>然后該進(jìn)程調(diào)用fork,此后父、子進(jìn)程之間就可應(yīng)用該管道。 </p>

<p>我們將會看到流管道(15.2節(jié))沒有第一種限制,F(xiàn)IFO(14.5節(jié))和命名流管道( 
</p>

<p>15.5節(jié))則沒有第二種限制。盡管有這兩種限制,半雙工管道仍是最常用的IPC形 
</p>

<p>式。 </p>

<p>管道是由調(diào)用pipe函數(shù)而創(chuàng)建的。 </p>

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

<p>int pipe(int filedes[2]) ; </p>

<p>返回:若成功為0,出錯為-1 </p>

<p>經(jīng)由參數(shù)filedes返回兩個文件描述符;filedes[0]是為讀而打開,filedes[1]是 
</p>

<p>為寫而打開的。filedes[1]的輸出是filedes[0]的輸入。 </p>

<p>有兩種方法來描畫一個管道,如圖14.2中所示。左半圖顯示了管道的兩端在一個進(jìn) 
</p>

<p>甚至 </p>

<p>更遲一點(diǎn)與IPC有關(guān)的Posix可能還不會制定出來。 </p>

<p>我們已將與IPC有關(guān)的討論分成兩章。在本章中,我們討論經(jīng)典的IPC;管道、FIF 
</p>

<p>O、消息隊列、信號量以及共享存儲器。在下一章中,我們將觀察SVR4和4.3+BSD共 
</p>

<p>同支持的IPC的某些高級特征,包括;流管道和命名的流管道,以及用這些更高級 
</p>

<p>形式IPC,我們可以做的一些事情。 </p>

<p>14.2 管道 </p>

<p>管道是Unix IPC的最老形式,并且所有Unix系統(tǒng)都提供此種通信機(jī)制,管道有兩種 
</p>

<p>限制; </p>

<p>1. 它們是半雙工的。數(shù)據(jù)只在一個方向流動。 </p>

<p>2. 
它們只能在具有公共祖先的進(jìn)程之間使用。通常,一個管道由一個進(jìn)程創(chuàng)建, 
</p>

<p>然后該進(jìn)程調(diào)用fork,此后父、子進(jìn)程之間就可應(yīng)用該管道。 </p>

<p>我們將會看到流管道(15.2節(jié))沒有第一種限制,F(xiàn)IFO(14.5節(jié))和命名流管道( 
</p>

<p>15.5節(jié))則沒有第二種限制。盡管有這兩種限制,半雙工管道仍是最常用的IPC形 
</p>

<p>式。 </p>

<p>管道是由調(diào)用pipe函數(shù)而創(chuàng)建的。 </p>

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

<p>int pipe(int filedes[2]) ; </p>

<p>返回:若成功為0,出錯為-1 </p>

<p>經(jīng)由參數(shù)filedes返回兩個文件描述符;filedes[0]是為讀而打開,filedes[1]是 
</p>

<p>為寫而打開的。filedes[1]的輸出是filedes[0]的輸入。 </p>

<p>有兩種方法來描畫一個管道,如圖14.2中所示。左半圖顯示了管道的兩端在一個進(jìn) 
</p>

<p>圖14.4 從父進(jìn)程到子進(jìn)程的管道 </p>

<p>對于從子進(jìn)程到父進(jìn)程的管道,父進(jìn)程關(guān)閉 fd[1],子進(jìn)程關(guān)閉fd[0]。 
</p>

<p>當(dāng)管道的一端被關(guān)閉后,下列規(guī)定起作用; </p>

<p>1. 當(dāng)讀一個寫端已被關(guān)閉的管道時,在所有數(shù)據(jù)都被讀取后,read返回0,以指示 
</p>

<p>達(dá)到了文件結(jié)束處。(從技術(shù)方面考慮,在管道的寫端還有進(jìn)程時,就不會產(chǎn)生文 
</p>

<p>件的結(jié)束。可以復(fù)制一個管道的描述符,使得有多個進(jìn)程具有寫打開文件描述符。 
</p>

<p>但是,通常一個管道只有一個讀進(jìn)程,一個寫進(jìn)程。在下一節(jié)介紹FIFO時,我們會 
</p>

<p>看到對于一個單一的FIFO常常有多個寫進(jìn)程)。 </p>

<p>2. 如果寫一個讀端已被關(guān)閉的管道,則產(chǎn)生信號SIGPIPE。如果忽略該信號或者捕 
</p>

<p>捉該信號并從其處理程序返回,則Write出錯返回,errno設(shè)置為EPIPE。 
</p>

<p>在寫管道時,常數(shù)PIPE_BUF規(guī)定了核中管道緩存器的大小。如果對管道進(jìn)行write 
</p>

<p>調(diào)用,而且要求寫的字節(jié)數(shù)小于等于PIPE_BUF,則此操作不會與其它進(jìn)程對同一管 
</p>

<p>道(或FIFO)的write操作穿插進(jìn)行。但是,若有多個進(jìn)程同時寫一個管道(或FI 
</p>

<p>FO),而且某個或某些進(jìn)程要求寫的字節(jié)數(shù)超過PIPE_BUF字節(jié)數(shù),則數(shù)據(jù)可能會與 
</p>

<p>其它寫操作的數(shù)據(jù)相穿插。 </p>

<p>實(shí)例 </p>

<p>程序14.1中創(chuàng)建了一個從父進(jìn)程到子進(jìn)程的管道,并且父進(jìn)程經(jīng)由該管道向子 
</p>

<p>進(jìn)程傳送數(shù)據(jù)。 </p>

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

<p>int </p>

<p>main(void) </p>

<p>{ </p>

<p>int n, fd[2]; </p>

<p>pid_t pid; </p>

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

<p>if (pipe(fd) &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(fd[0]); </p>

<p>write(fd[1], &quot;hello world\n&quot;, 12); </p>

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

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

<p>n = read(fd[0], line, MAXLINE); </p>

<p>write(STDOUT_FILENO, line, n); </p>

<p>} </p>

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

<p>} </p>

<p>程序14.1 經(jīng)由管道父進(jìn)程向子進(jìn)程傳送數(shù)據(jù) </p>

<p>在上面的例子中,我們直接對管道描述符調(diào)用read和write。更為有益的是將管道 
</p>

<p>描述符復(fù)制為標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出。在此之后通常子進(jìn)程調(diào)用exec,執(zhí)行另一道程 
</p>

<p>序,開從標(biāo)準(zhǔn)輸入(已創(chuàng)建的管道)或?qū)?shù)據(jù)寫至其標(biāo)準(zhǔn)輸出(管道)。 
</p>

<p>實(shí)例 </p>

<p>讓我們編寫一道程序,其功能是每次一頁顯示已產(chǎn)生的輸出。已經(jīng)有很多Unix公用 
</p>

<p>程序具有分頁功能,因此我們無需再構(gòu)造一個新的分頁程序,而是調(diào)用用戶最喜愛 
</p>

<p>的分頁程序。為了避免先將所有數(shù)據(jù)寫到一個臨時文件中,然后再調(diào)用系統(tǒng)中有關(guān) 
</p>

<p>程序顯示該文件,我們希望將輸出通過管道直接送到分頁程序。為此,先創(chuàng)建一個 
</p>

<p>管道,一個子進(jìn)程,使子進(jìn)程的標(biāo)準(zhǔn)輸入成為管道的讀端,然后exec用戶喜愛的分 
</p>

<p>頁程序。程序14.2顯示了如何實(shí)現(xiàn)這些操作。(本例要求在命令行中有一個參 
</p>

<p>數(shù)說明要顯示的文件的名稱。通常,這種類型的程序要求在終端上顯示的數(shù)據(jù)已經(jīng) 
</p>

<p>在存儲器中。) </p>

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

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

<p>#define DEF_PAGER &quot;/usr/bin/more&quot; /* default pager program */ </p>

<p>int </p>

<p>main(int argc, char *argv[]) </p>

<p>{ </p>

<p>int n, fd[2]; </p>

<p>pid_t pid; </p>

<p>char line[MAXLINE], *pager, *argv0; </p>

<p>FILE *fp; </p>

<p>if (argc != 2) </p>

<p>err_quit(&quot;usage: a.out &lt;pathname&gt;&quot;); </p>

<p>if ( (fp = fopen(argv[1], &quot;r&quot;)) == NULL) </p>

<p>err_sys(&quot;can't open %s&quot;, argv[1]); </p>

<p>if (pipe(fd) &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) { </p>

<p>/* parent */ </p>

<p>close(fd[0]); /* close read end */ </p>

<p>/* parent copies argv[1] to pipe */ </p>

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

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

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

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

<p>} </p>

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

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

<p>close(fd[1]); /* close write end of pipe for reader */ </p>

<p>if (waitpid(pid, NULL, 0) &lt; 0) </p>

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

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

<p>} else { </p>

<p>/* child */ </p>

<p>close(fd[1]); /* close write end */ </p>

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

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

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

<p>close(fd[0]); /* don't need this after dup2 */ </p>

<p>} </p>

<p>/* get arguments for execl() */ </p>

<p>if ( (pager = getenv(&quot;PAGER&quot;)) == NULL) </p>

<p>pager = DEF_PAGER; </p>

<p>if ( (argv0 = strrchr(pager, '/')) != NULL) </p>

<p>argv0++; /* step past rightmost slash */ </p>

<p>else </p>

<p>argv0 = pager; /* no slash in pager */ </p>

<p>if (execl(pager, argv0, (char *) 0) &lt; 0) </p>

<p>err_sys(&quot;execl error for %s&quot;, pager); </p>

<p>} </p>

<p>} </p>

<p>程序14.2 將文件復(fù)制到分頁程序 </p>

<p>在調(diào)用fork之前先創(chuàng)建一個pipe。fork之后父進(jìn)程關(guān)閉其讀端,子進(jìn)程關(guān)閉其寫端 
</p>

<p>。子進(jìn)程然后調(diào)用dup2,使其標(biāo)準(zhǔn)輸入成為管道的讀端。當(dāng)執(zhí)行分頁程序時,其標(biāo) 
</p>

<p>準(zhǔn)輸入將是管道的讀端。 </p>

<p>當(dāng)我們將一個描述符復(fù)制到另一個時(在子進(jìn)程中,fd[0]復(fù)制到標(biāo)準(zhǔn)輸入),應(yīng) 
</p>

<p>當(dāng)注意該描述符的值并不已經(jīng)是所希望的值。如果該描述符已經(jīng)具有所希望的值, 
</p>

<p>并且我們先調(diào)用dup2,然后close則將關(guān)閉在此進(jìn)程中只有該單個描述符所代表的 
</p>

<p>打開文件。(請回憶3.12節(jié)中所述,當(dāng)dup2中的兩個參數(shù)值相等時的操作。)在本 
</p>

<p>程序中,如果shell沒有打開標(biāo)準(zhǔn)輸入,那么程序開始處的fopen應(yīng)已使用描述符0 
</p>

<p>,也就是最小末使用的描述符,所以fd[0]決不會等于標(biāo)準(zhǔn)輸入。盡管如此,只要 
</p>

<p>先調(diào)用dup2,然后close以復(fù)制一個描述符到另一個,作為一種保護(hù)性的編程措施 
</p>

<p>,我們總是先將兩個描述符進(jìn)行比較。 </p>

<p>請注意,我們是如何使用環(huán)境變量PAGER而獲得用戶分頁程序名稱的。如果這種操 
</p>

<p>作沒有成功,則使用系統(tǒng)默認(rèn)值。這是環(huán)境變量的常見用法。 </p>

<p>實(shí)例 </p>

<p>請回憶8.8節(jié)中的五個函數(shù)TELL_WAIT、TELL_PARENT、TELL_CHILD、WAIT_PARENT以 </p>

<p>及WAIT_CHILD。在程序10.17中,我們提供了一個使用信號的實(shí)現(xiàn)。程序14.3則是 
</p>

<p>一個使用管道的實(shí)現(xiàn)。 </p>

<p>如圖14.5所示,我們在fork之前創(chuàng)建了兩個管道。 </p>

<p>圖14.5 用兩個管道實(shí)現(xiàn)父-子進(jìn)程的同步 </p>

<p>父進(jìn)程在調(diào)用TELL_CHILD時經(jīng)由上一個管道寫一個字符&quot;P&quot;,子進(jìn)程在調(diào)用TELL_P 
</p>

<p>ARENT時,經(jīng)由下一個管道寫一個字符&quot;C&quot;。相應(yīng)的WAIT_XXX函數(shù)調(diào)用read讀一個字 
</p>

<p>符,沒有讀到字符時阻塞(睡眠等待)。 </p>

<p>請注意,每一個管道都有一個額外的讀取進(jìn)程,這沒有關(guān)系。也就是說除了子進(jìn)程 
</p>

<p>從pfd1[0]讀取,父進(jìn)程也有上一個管道的讀端。因為父進(jìn)程并沒有執(zhí)行對該管道 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品电影在线| 极品尤物av久久免费看| 精品影视av免费| 亚洲欧洲av在线| 国产一区二区不卡老阿姨| 欧美精品少妇一区二区三区| 亚洲欧美中日韩| 日韩午夜中文字幕| 日本三级亚洲精品| 欧美日韩成人高清| 三级不卡在线观看| 亚洲欧美偷拍卡通变态| 一本大道久久a久久精品综合| 成人欧美一区二区三区黑人麻豆| 91精品国产一区二区| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩欧美中文一区| 欧美亚洲禁片免费| 美美哒免费高清在线观看视频一区二区| 中文字幕一区二区三区不卡| 精品久久99ma| 欧美96一区二区免费视频| 久久色.com| 白白色亚洲国产精品| 久久嫩草精品久久久精品| jvid福利写真一区二区三区| 久热成人在线视频| 中文字幕亚洲一区二区av在线 | 欧美视频在线观看一区二区| 丁香网亚洲国际| 国产精品国产自产拍高清av王其| av网站一区二区三区| 激情成人综合网| 亚洲视频香蕉人妖| 欧美一区二区免费视频| 欧美丝袜丝nylons| 欧美亚男人的天堂| 成人看片黄a免费看在线| 亚洲免费色视频| 亚洲精品午夜久久久| 91精品国产色综合久久| 欧美美女网站色| 欧美日韩精品久久久| 欧美四级电影网| 欧美美女一区二区在线观看| 欧美日韩一级视频| 懂色中文一区二区在线播放| 国产一区二区看久久| 国产成人精品影视| 日韩高清电影一区| 日韩国产精品久久久久久亚洲| 亚洲成a人v欧美综合天堂下载 | 色一情一乱一乱一91av| 国产成人精品一区二区三区四区| 国产99精品视频| 成人高清免费在线播放| 国产自产视频一区二区三区| 国产一区二区三区黄视频 | 欧美精品xxxxbbbb| 日韩一区二区高清| 精品国产精品网麻豆系列| 国产三级一区二区三区| 777欧美精品| 在线亚洲欧美专区二区| 岛国一区二区三区| 91丨porny丨首页| 国产999精品久久久久久| 国产一区二区不卡在线| 高清不卡一二三区| 一本大道久久a久久精品综合| 欧美精品丝袜中出| 久久综合中文字幕| 亚洲色图第一区| 五月婷婷欧美视频| 最新久久zyz资源站| 亚洲综合小说图片| 国产精品免费视频一区| 日韩欧美国产一二三区| 91.麻豆视频| 久久综合久久99| 一区二区三区四区乱视频| 国产精品久线在线观看| 亚洲国产成人tv| 亚洲国产日产av| 韩国v欧美v日本v亚洲v| 99久久精品免费看国产| 国产成人三级在线观看| 欧美午夜一区二区| 国产三级精品三级| 国产午夜精品久久久久久久| 亚洲香肠在线观看| 国产麻豆成人精品| 欧美欧美午夜aⅴ在线观看| 精品成a人在线观看| 一区二区三区免费在线观看| 久久超碰97中文字幕| 色中色一区二区| 2021国产精品久久精品| 玉米视频成人免费看| 视频一区视频二区在线观看| jiyouzz国产精品久久| 精品国精品国产| 亚欧色一区w666天堂| www.成人在线| 久久久久久9999| 日韩成人伦理电影在线观看| 91精品福利视频| 欧美日韩性生活| 中文字幕一区二区三区蜜月| 精品一区二区三区在线观看国产| 精品视频1区2区| 亚洲欧美电影院| 风间由美性色一区二区三区| 日韩欧美在线影院| 午夜电影久久久| 欧美优质美女网站| 综合欧美亚洲日本| jiyouzz国产精品久久| 欧美激情一区二区三区全黄| 亚洲麻豆国产自偷在线| 国产成人精品在线看| 久久久另类综合| 极品少妇一区二区| 精品精品国产高清a毛片牛牛| 亚洲超碰精品一区二区| 在线观看91精品国产入口| 1000部国产精品成人观看| 夫妻av一区二区| 中文字幕欧美三区| 国产成人一区在线| 久久午夜色播影院免费高清| 黄色日韩网站视频| 精品国一区二区三区| 国产一区二区久久| 国产亚洲一区二区三区在线观看| 国产一区二区三区四区五区入口| 精品美女一区二区| 国内精品国产三级国产a久久| 精品第一国产综合精品aⅴ| 精品在线播放免费| 久久久精品中文字幕麻豆发布| 国产九色sp调教91| 欧美色图在线观看| 亚洲电影在线免费观看| 欧美日韩视频在线观看一区二区三区| 亚洲国产综合在线| 日韩视频一区二区三区| 免费成人av在线| 久久亚洲二区三区| 成人手机电影网| 亚洲免费av在线| 91精品午夜视频| 国产美女在线观看一区| 国产精品每日更新| 在线日韩一区二区| 奇米777欧美一区二区| 精品国偷自产国产一区| 国产91在线观看丝袜| 亚洲另类色综合网站| 91精品国产一区二区三区蜜臀| 韩日精品视频一区| 成人免费视频在线观看| 欧美另类久久久品| 国产一区视频在线看| 亚洲欧洲精品一区二区精品久久久| 91黄色激情网站| 久久精品国产久精国产| 日本一区免费视频| 欧美怡红院视频| 韩国精品主播一区二区在线观看| 亚洲欧洲性图库| 欧美一级免费观看| 懂色av一区二区三区免费观看| 一区二区三区中文字幕精品精品| 91精品国产91久久久久久一区二区| 国产一区二区三区蝌蚪| 一区二区三区在线视频观看 | 色综合天天在线| 久久久国产精品午夜一区ai换脸| 91片黄在线观看| 免费成人在线视频观看| ●精品国产综合乱码久久久久| 在线电影欧美成精品| 成人小视频在线| 日韩av在线发布| 国产精品国产a| 日韩精品一区二区三区视频 | 亚洲一区二三区| 久久亚洲一区二区三区明星换脸| 色女孩综合影院| 国产精品456露脸| 三级欧美韩日大片在线看| 中文字幕日韩精品一区| 精品久久久久久久久久久久久久久 | 色综合久久中文字幕| 国产乱对白刺激视频不卡| 亚洲成人一区在线| 中文字幕亚洲欧美在线不卡| 精品久久人人做人人爽| 欧美在线观看一区|