freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

四川大學(xué)linux第4章unix進(jìn)程管理及進(jìn)程通信-資料下載頁

2025-03-09 20:18本頁面
  

【正文】 ,數(shù)據(jù)以數(shù)據(jù)流方式在管道中傳送。 ? 管道是一種半雙工的通信形式,數(shù)據(jù)只能向一個(gè)方向流動(dòng)。如果發(fā)送進(jìn)程與接收進(jìn)程之間都需要利用管道傳送數(shù)據(jù),則需要建立兩個(gè)管道。 ? 管道的實(shí)現(xiàn)機(jī)理是在進(jìn)程之間利用了共享文件作為中介,發(fā)送進(jìn)程將通信數(shù)據(jù)寫入文件,接收進(jìn)程從文件讀出數(shù)據(jù)。這樣的文件常被稱為管道( pipe)文件。對(duì)管道的應(yīng)用要考慮進(jìn)程同步問題。 管道 管道有兩種類型:無名管道和有名管道。 無名管道( Unnamed Pipes) ? 無名管道利用系統(tǒng)函數(shù) pipe()建立,管道文件是無名臨時(shí)文件,用 pipe()返回的文件描述符來標(biāo)識(shí)該文件。 ? 只有調(diào)用 pipe()的進(jìn)程及其子孫進(jìn)程才能識(shí)別進(jìn)程創(chuàng)建的無名管道,才能利用該管道讀寫數(shù)據(jù)。當(dāng)進(jìn)程不需要使用無名管道時(shí),由操作系統(tǒng)核心收回其索引節(jié)點(diǎn)。 有名管道( Named Pipes) ? 有名管道利用系統(tǒng)函數(shù) mknod()建立,管道文件是可以長(zhǎng)期存在的有名文件。 ? 可用于所有進(jìn)程之間的通信。對(duì)有名管道的訪問與對(duì)文件的訪問完全相同。用系統(tǒng)函數(shù) open()打開管道,用系統(tǒng)函數(shù) write()寫輸入數(shù)據(jù)到管道,用系統(tǒng)函數(shù)read()從管道讀出數(shù)據(jù)。如果一個(gè)進(jìn)程不使用有名管道時(shí),用系統(tǒng)函數(shù) close()關(guān)閉管道。 管道 2. 無名管道 創(chuàng)建無名管道的函數(shù)為 pipe(),其語法格式如下: int pipe(filedes)。 int fileds[2]。 ? 其中 filedes是文件描述符,由 filedes[0]和 filedes[1]組成。 ? filedes[1]是寫入管道的文件描述符, filedes[0]是從管道讀出的文件描述符。 管道 ? 必須通過文件描述符 filedes[0]和 filedes[1]來訪問管道,只有創(chuàng)建管道的進(jìn)程或其子進(jìn)程才能使用文件描述符。 ? 為了提高進(jìn)程對(duì)管道的訪問效率,管道文件只使用文件索引節(jié)點(diǎn)中的直接地址項(xiàng) i_addr(0)~i_addr(9)。如果每個(gè)盤塊為 4 KB大小,則管道文件的最大長(zhǎng)度被限制在 10 KB。 ? 操作系統(tǒng)核心將索引節(jié)點(diǎn)中的直接地址塊作為一個(gè)循環(huán)隊(duì)列管理,設(shè)置一個(gè)寫指針和一個(gè)讀指針。 ? 當(dāng)一個(gè)進(jìn)程正在寫管道,如果寫的字節(jié)數(shù)與管道中已有的字節(jié)數(shù)之和小于或等于管道容量,根據(jù)管道先進(jìn)先出原則,從管道中讀出數(shù)據(jù)。 管道 ? 管道中的數(shù)據(jù)以緩沖隊(duì)列方式進(jìn)行管理,內(nèi)核在進(jìn)程每次寫之后自動(dòng)增加管道大小,管道數(shù)據(jù)量隨著逐次寫而逐次增加,內(nèi)核不會(huì)讓進(jìn)程寫操作覆蓋管道中的數(shù)據(jù)。這與正規(guī)文件在文件尾寫入數(shù)據(jù)情形相同。 ? 當(dāng)寫進(jìn)程將全部數(shù)據(jù)寫入管道時(shí),內(nèi)核會(huì)記下管道的索引節(jié)點(diǎn)寫指針,以使后面的寫進(jìn)程接著寫,同時(shí)喚醒所有睡眠等待讀數(shù)據(jù)的進(jìn)程。 ? 當(dāng)一個(gè)進(jìn)程正在寫管道,要寫的字節(jié)數(shù)與管道中已有的字節(jié)數(shù)之和大于管道容量時(shí),則內(nèi)核會(huì)對(duì)索引節(jié)點(diǎn)作相應(yīng)標(biāo)記,并讓寫進(jìn)程進(jìn)入睡眠等待,直到有讀進(jìn)程將數(shù)據(jù)讀出后,再喚醒該寫進(jìn)程繼續(xù)寫。 ? 當(dāng)寫進(jìn)程不止一個(gè)時(shí),可能存在一個(gè)進(jìn)程寫入管道中的數(shù)據(jù)不連續(xù),其中會(huì)插入另一個(gè)進(jìn)程寫入的數(shù)據(jù)。這時(shí),發(fā)送進(jìn)程需要對(duì)發(fā)送的數(shù)據(jù)進(jìn)行標(biāo)記。 管道 ? 當(dāng)一個(gè)進(jìn)程讀管道,核心檢查到管道中有數(shù)據(jù)時(shí),讀進(jìn)程就從索引節(jié)點(diǎn)讀指針標(biāo)記處開始讀,讀完后核心會(huì)將當(dāng)前偏移量保存在索引節(jié)點(diǎn)中并喚醒等待寫進(jìn)程。 ? 當(dāng)一個(gè)進(jìn)程要讀的數(shù)據(jù)量大于管道內(nèi)的數(shù)據(jù)量時(shí),讀進(jìn)程會(huì)在讀完管道中的所有數(shù)據(jù)后進(jìn)入睡眠,等待寫進(jìn)程寫入后再次讀。 管道 (1) 進(jìn)程寫管道 ? 寫進(jìn)程和讀進(jìn)程對(duì)管道的訪問需要互斥。 ? 只有讀文件描述符存在的情況下才能將數(shù)據(jù)通過寫文件描述符寫入管道。 ? 進(jìn)程向管道寫數(shù)據(jù)時(shí)須注意管道大小限制,管道中已有的數(shù)據(jù)與要寫入數(shù)據(jù)之和不能大于管道的容量。 ? 如果管道中無空間存放要寫入的數(shù)據(jù)時(shí),寫進(jìn)程要睡眠等待,直到讀進(jìn)程將數(shù)據(jù)讀出將其喚醒后才能再寫入數(shù)據(jù)。 管道 寫管道的函數(shù)格式如下: write(filedes[1],buf,size)。 int filedes[1],size。 char buf[]。 其中: filedes[1]為寫入管道的描述符; buf是要寫入管道的數(shù)據(jù); size是寫入的數(shù)據(jù)位組長(zhǎng)度。 管道 (2) 進(jìn)程讀管道 ? 進(jìn)程從管道讀數(shù)據(jù)時(shí)如果管道中已經(jīng)有數(shù)據(jù),進(jìn)程則按先進(jìn)先出的原則通過讀指針讀取數(shù)據(jù),讀結(jié)束后,修改索引節(jié)點(diǎn)讀指針并喚醒寫進(jìn)程; ? 如果進(jìn)程要讀的數(shù)據(jù)不在管道中,進(jìn)程則睡眠等待寫進(jìn)程寫入數(shù)據(jù)并將其喚醒。 管道 ? 讀管道的函數(shù)格式如下: read(filedes[0],buf,size)。 int filedes[1],size。 char buf[]。 其中: filedes[0]為從管道讀的描述符; 從管道讀出的數(shù)據(jù)放入 buf中; size是讀出的數(shù)據(jù)位組長(zhǎng)度。 管道 例 下面的程序是管道通信在同一進(jìn)程進(jìn)行。首先進(jìn)程創(chuàng)建一個(gè)無名管道,然后向該管道寫入字符,再將寫入的字符讀出。 include include include char string []=wele to unnamed pipe。 int main() { int filedes[2]。 char inbuf [256]。 if (pipe(filedes)0) /* 創(chuàng)建無名管道 */ { perror (could not create unnamed pipe)。 exit(1)。 } write(filedes[1],string,23)。 /*寫入 filedes[1]的數(shù)據(jù)是從filedes[0]讀出的 */ close(filedes[1])。 /*關(guān)閉管道寫端 */ memset(inbuf, 0, sizeof(inbuf))。 read(filedes[0],inbuf,23)。 close(filedes[0])。 /*關(guān)閉管道讀端 */ printf(%s\n,inbuf)。 exit(0)。 } 管道 程序執(zhí)行的結(jié)果是打印出: wele to unnamed pipe 管道 例 下面的程序是父子進(jìn)程通過管道進(jìn)行通信。父進(jìn)程將數(shù)據(jù)發(fā)送給子進(jìn)程。 include include include include char string []=wele to named pipe。 main() { int filedes[2],i,pid。 char inbuf[256]。 if (pipe(filedes)0) /* 創(chuàng)建可擦寫的無名管道 */ { perror(could not create unnamed pipe)。 exit(1)。 } if ((pid = fork())0) /* 創(chuàng)建子進(jìn)程 */ { perror(could not create subprocess)。 exit(2)。 } 管道 if (pid0) /* 父進(jìn)程 */ { close(filedes[0])。 /*寫之前先關(guān)閉管道讀端 */ write(filedes[1],string,23)。 printf(the parent process sended\n)。 close(filedes[1])。 /*寫完關(guān)閉管道寫端 */ wait(0)。 } if (pid==0) /* 子進(jìn)程 */ { memset(inbuf, 0, sizeof(inbuf))。 close(filedes[1])。 /*讀之前先關(guān)閉管道寫端 */ sleep(3)。 /* 在讀管道之前確保父進(jìn)程關(guān)閉寫端 */ read(filedes[0],inbuf,23)。 printf(the subparent process received\n)。 printf(%s\n,inbuf)。 close(filedes[0])。 /*讀之后關(guān)閉管道讀端 */ } exit(0)。 } 管道 程序執(zhí)行的結(jié)果是 the parent process sended the subparent process received wele to named pipe 管道 3. 有名管道 ? 無名管道不能實(shí)現(xiàn)不同用戶進(jìn)程之間的通信,針對(duì)此,提出了進(jìn)程通信的有名管道。 ? 有名管道利用了文件系統(tǒng)中的可以長(zhǎng)期存在的文件實(shí)現(xiàn),適用于所有進(jìn)程之間的通信。 ? 有名管道利用系統(tǒng)函數(shù) mknod()建立,通過系統(tǒng)函數(shù) read()和 write()對(duì)管道進(jìn)行讀和寫訪問。 ? 與無名管道不同的是,有名管道在訪問之前必須用系統(tǒng)函數(shù) open()打開。 管道 ? 系統(tǒng)函數(shù) mknod()用于創(chuàng)建文件系統(tǒng)中的特殊文件,如:有名管道、設(shè)備文件和目錄等, ? 其語法的格式如下: mknod(pathname,type and permissions,dev)。 其中: pathname是要建立的特殊文件名(有名管道名、目錄名); type and permission給出特殊文件類型和訪問權(quán)限; dev為塊特殊文件和字符特殊文件規(guī)定的主設(shè)備號(hào)和次設(shè)備號(hào)(此處是有名管道, dev參數(shù)為 0)。 ? 用系統(tǒng)函數(shù) mknod()創(chuàng)建一個(gè)有名管道,內(nèi)核為管道文件分配一個(gè)索引節(jié)點(diǎn)并在索引節(jié)點(diǎn)中設(shè)置該文件類型是有名管道。 管道 (1) 有名管道的打開 ? 與有名管道對(duì)應(yīng)的管道文件有自己的文件目錄項(xiàng),可以通過路徑名存取。 ? 進(jìn)程打開有名管道與打開一般文件方式一樣,為了計(jì)數(shù)因讀寫而打開有名管道的進(jìn)程數(shù)目,內(nèi)核用了文件索引節(jié)點(diǎn)的讀計(jì)數(shù)和寫計(jì)數(shù)。 ? 與無名管道一樣,對(duì)有名管道的打開和訪問必須采用進(jìn)程同步。 ? 為了加快訪問效率,有名管道同樣利用了文件索引節(jié)點(diǎn)的直接地址塊作為文件塊。文件塊的管理形式也是一個(gè)循環(huán)隊(duì)列管理,先進(jìn)先出。 管道 打開有名管道的系統(tǒng)函數(shù)格式如下: int open(path,flags)。 該調(diào)用返回文件描述符。 其中: path為文件名; flags為打開類型,按 POSIX標(biāo)準(zhǔn)包括: O_RDONLY(只讀)、 O_WRONLY(只寫)、 O_RDWR(讀寫)、O_APPEND、 O_CREAT、 O_EXCL、 O_NOCTTY、O_NONBLOCK、 O_TRUNC。 管道 (2) 有名管道的讀寫 ? 有名管道的讀寫要求進(jìn)程具有對(duì)有名管道的存取權(quán)限,讀管道進(jìn)程的數(shù)目不要求與寫管道進(jìn)程的數(shù)目相同。 ? 有名管道同樣采用系統(tǒng)函數(shù) read()和 write()讀寫管道。 管道 (3) 管道的關(guān)閉 關(guān)閉有名管道的系統(tǒng)函數(shù)格式如下: close(filedes)。 filedes為需要關(guān)閉的有名管道的文件描述符。 關(guān)閉管道的步驟是: ? 內(nèi)核首先處理讀寫進(jìn)程,如果無寫進(jìn)程、有讀進(jìn)程,內(nèi)核會(huì)喚醒讀進(jìn)程并讓其讀系統(tǒng)函數(shù)調(diào)用空數(shù)據(jù)返回; ? 如果有寫進(jìn)程、無讀進(jìn)程,內(nèi)核會(huì)喚醒寫進(jìn)程并發(fā)送一個(gè)發(fā)生錯(cuò)誤的信號(hào)(向某個(gè)非讀的進(jìn)程管道中寫入數(shù)據(jù))給寫進(jìn)程。 ? 除了處理讀寫進(jìn)程外,內(nèi)核還必須釋放所有數(shù)據(jù)塊并修改索引節(jié)點(diǎn)指明管道為空。 管道 例 在同一進(jìn)程中首先創(chuàng)建一個(gè)有名管道,然后向該管道寫入字符,再將寫入的字符讀出。 include sys/ include char filename[] = ./myfifo。 char string[]=wele to named pipe。 main(argc,argv) int argc。 char *argv []。 { int filedes[2]。 char buf[256]。 /* 創(chuàng)建可擦寫的有名管道 myfifo */ if (mknod(filename, O_CREAT | S_IRUSR | S_IWUSR, 0) == 1) { perror(mknod error)。 exit(1)。 } filedes[0]=open(filename, O_RDONLY)。 /*以只讀方式打開管道 myfifo */ filedes[1]=open(filename, O_WRONLY)。 /*以讀寫方式打開管道 myfif
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1