999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux兩種管道通信方式的分析

2023-09-06 05:43:15鄧飛蔡波
現代信息科技 2023年14期

鄧飛 蔡波

摘 ?要:Linux系統中管道通信是從Unix系統繼承的一種通信方式,管道是操作系統內核管理的一個內存緩沖區,采用半雙工的通信方式。由于管道是臨界資源,所以進程要互斥地訪問管道,管道分為無名管道和命名管道。文章分析了Linux進程之間采用無名管道和命名管道通信的特點,并對無名管道的父子進程、兄弟進程以及命名管道通信進行了研究對比。

關鍵詞:進程通信;臨界資源;無名管道;命名管道

中圖分類號:TP311 ? ? 文獻標識碼:A ? 文章編號:2096-4706(2023)14-0054-03

Analysis of Two Pipe Communication Ways of Linux

DENG Fei, CAI Bo

(Chengdu Colledge of University of Electronic Science and Technology of China, Chengdu ?611731, China)

Abstract: Pipe communication in Linux system is a communication mode inherited from Unix system. The pipe is a memory buffer managed by the operating system kernel, and it adopts half-duplex communication mode. Because pipe is a critical resource, process should access the pipe file mutually exclusive. Pipes are divided into anonymous pipe and named pipe. This paper analyzes the characteristics of pipe communication mainly adopts the anonymous pipe and named pipe between Linux Processes. The research and comparison of the parent-child process, sibling process and the anonymous pipe and named pipe communication is carried out.

Keywords: process communication; critical resource; anonymous pipe; named pipe

0 ?引 ?言

Linux管道是由操作系統內核管理的一個內存緩沖區,該緩沖區以循環隊列結構采用先進先出方式的傳輸數據,即管道采用某一方向的方式傳輸數據,一個進程連接管道輸入端,該進程會向管道末端寫入數據;另一個進程連接管道的輸出端,該進程會讀取被放入管道的數據;而且管道中的數據只能被讀取一次,即不能重復讀取[1],數據所占用空間被讀走數據以便下次留給寫進程寫入數據。由于管道在進程通信過程中數據被存放在內存緩沖區,緩沖區是臨界資源,所以為了保證讀寫進程對緩沖區里數據正確訪問,對管道需要互斥訪問[2]。雖然管道并不能像普通磁盤文件存放數據,但可以被看成特殊的文件,也可以使用讀、寫、關閉等系統函數訪問管道[3]。Linux管道分為無名管道和命名管道兩種。本文主要圍繞Linux無名管道的父子進程、兄弟進程通信以及命名管道通信特點進行研究對比。

1 ?無名管道通信機制

無名管道并不是真正的外存磁盤文件,實際為系統內核緩沖區。具有血緣關系的兩個進程只能使用無名管道通信,指具有一個共同祖先的兩個進程之間才能利用無名管道通信,所以無名管道可以應用在父子、兄弟進程之間的通信[4]。

由于無名管道沒有文件名,所以無名管道是通過文件描述符方式控制讀寫端來實現通信,當進程新建管道時,系統會給調用pipe函數的進程分配文件描述符fd [0]和fd [1],一般情況下從管道讀取數據使用fd [0]端,而往管道寫入數據使用fd[1]端[5],這樣就形成了一條半雙工的擁有固定的讀端和寫端數據傳輸通道。

在實際使用無名管道通信時,系統給新建管道的進程返回文件描述符fd[0]和fd[1],接著新建子孫進程,子孫進程會繼承文件描述符fd[0]和fd[1],這些有血緣關系的進程都有自己的讀寫端,這樣便可以實現它們共享該管道[6],為了實現它們中任意兩個進程通信就需要保留相應的讀、寫端,將多余的讀、寫端對應的文件描述符關閉就可以了。

下面分別對父子、兄弟進程的無名管道通信進行分析。

1.1 ?父子進程之間的管道通信分析

一般情況在利用無名管道通信的父子進程之間建立起一條“子進程寫入父進程讀取”的通道,如圖1所示。父進程調用pipe()函數新建管道,系統給父進程指定文件描述符fd[0]和fd[1],接著創建子進程,子進程會繼承父進程的文件描述符fd[0]和fd[1],父子進程共享該管道;子進程保留文件描述符fd[1]向管道寫入數據而關閉自己的讀取端fd[0],而父進程保留文件描述符fd[0]從管道讀取數據而關閉自己的寫入端fd[1],這樣就建立了一條通信通道。

圖1 ?父子進程之間管道通信示意圖

父進程調用fork()創建子進程,父進程保留讀端fd[0],子進程保留寫端fd[1],其余讀寫端口關閉。子進程調用函數write(fd[1], s, strlen((const char*)s))將s指向的內存數據寫入管道,fd[1]為子進程的寫入端;父進程調用函數read(fd[0],buf,size)從管道讀走數據,fd[0]為父進程的讀端;size為管道對應的內核緩沖區大小。下面為通信父、子進程的部分代碼:

(1)/*子進程的部分代碼*/

{ /* 子進程關閉讀描述符*/

close(fd[0]);

/*子進程向管道寫入real_write字節數據 */

real_write = write(fd[1], s, strlen((const char*)s)))

/* 完成所有寫任務后關閉寫端 */

close(fd[1]); }

(2)/*父進程的部分代碼*/

{ /*父進程關閉寫端*/

close(fd[1]);

/*父進程從管道中讀走real_read字節的數據*/

real_read = read(fd[0], buf, size);

/*完成所有讀任務后關閉讀取端*/

close(fd[0]); }

1.2 ?兄弟進程之間的管道通信分析

由于無名管道應用在有血緣關系的進程之間通信,所以無名管道也能在兄弟進程之間實現通信。兄弟進程利用管道通信如圖2所示,父進程調用pipe()函數新建管道,系統給父進程指定文件描述符fd[0]和fd[1],接著由父進程新建子進程A、B,兩個子進程A、B都繼承父進程的文件描述符fd[0]、fd[1],這樣父進程和子進程A、B三個進程共享無名管道,即三個進程的文件描述符fd[0]、fd[1]分別和管道兩端相連接。

圖2 ?兄弟進程之間管道通信示意圖

父進程調用fork()創建子進程A、B,子進程A保留寫端fd[1],子進程B保留讀端fd[0],其余讀寫端口關閉,父進程的讀寫端都關閉,這樣形成“子進程A寫入,子進程B讀走數據”的通信通道。子進程A調用函數write(fd[1], s, strlen((const char*)s))將s指向的內存數據寫入管道,fd[1]為子進程A的寫入端;子進程B調用函數read(fd[0], buf, size)從管道讀走數據,fd[0]為子進程B的讀端;size為管道緩沖區大小。下面為通信子進程A、B的部分代碼:

(1)/*子進程A的部分代碼*/

{ /* 子進程A關閉讀描述符*/

close(fd[0]);

/* 子進程A向管道寫入real_write字節數據 */

real_write = write(fd[1], s, strlen((const char*)s)))

/* 子進程A完成所有寫任務后關閉寫端 */

close(fd[1]); }

(2)/*子進程B的部分代碼*/

{ /*子進程B關閉寫端*/

close(pipe_fd[1]);

/* 子進程B向從管道讀走real_read字節數據 */

real_read = read(fd[0], buf, size);

/* 完成所有讀任務后關閉讀端 */

close(pipe_fd[0]); }

2 ?命名管道通信分析

只是無名管道才能實現血緣關系的進程通信,為了實現無血緣進程通信而提出命名管道。命名管道雖然在外存磁盤上有文件標識,但是利用命名管道通信的兩個進程傳輸的數據并不會存放在磁盤文件中,而是存放在內存緩沖區,命名管道對應外存磁盤上的具體路徑下文件,如圖3所示,/home/FIFO表示在路徑/home下的命名管道文件FIFO。

圖3 ?命名管道通信示意圖

命名管道/home/FIFO被創建后,利用命名管道通信的兩個進程就可以將命名管道FIFO看成一個磁盤文件來訪問,這樣傳輸數據時會調用函數open()、read()和write()和close()等來訪問命名管道。由于命名管道采用隊列先進先出方式來處理數據,只能單向傳送,所以對命名管道實現寫功能時將數據添加到管道尾部,實現讀功能時從命名管道首部讀取數據。

讀、寫進程訪問命名管道FIFO有阻塞和非阻塞兩種方式:

1)采用阻塞方式訪問命名管道時,對于寫進程,在讀進程讀完管道里數據之前寫進程會一直阻塞;而對于讀進程,命名管道FIFO中沒有數據或寫進程沒有完成寫操作之前讀進程會一直阻塞;

2)采用非阻塞方式訪問命名管道時,對于寫進程,在讀進程讀完管道里數據之前,寫操作只能部分數據寫入管道或寫操作失敗;對于讀進程而言,無論管道FIFO有無數據時都會執行讀操作,只是當管道FIFO中沒有數據時讀操作結果返回0而已。

由于管道為臨界資源,為了實現互斥訪問命名管道,保證數據能正確傳輸,常常對命名管道實現讀、寫操作時采用阻塞方式[6]。

以上面圖4里創建的命名管道/home/FIFO為例,讀、寫進程采用阻塞方式打開管道,寫進程調用函數write (fd,buf,size)把寫進程緩沖區的數據寫入管道,讀進程調用函數read(fd,buf,size)從管道讀取數據到讀進程緩沖區,size為管道緩沖區大小,fd指向命名管道/home/FIFO。

1)寫進程以只寫阻塞方式打開/home/FIFO管道:fd = open(/home/FIFO,O_WRONLY);

向管道中寫入nwrite字節數據:nwrite = write(fd,buff,size);

2)讀進程以只讀阻塞方式打開/home/FIFO管道:fd = open(/home/FIFO,O_RDONLY);

從管道中讀走nread 字節數據:nread = read(fd,buff,size)。

3 ?無名管道和命名管道的異同

無名管道的特點:1)只有血緣關系的進程才能訪問無名管道;2)無名管道通過控制文件描述符確定管道的讀、寫端;3)無名管道不是普通的磁盤文件,通信時傳輸的數據存放在內存緩沖區。

命名管道的特點:1)命名管道可以在任何沒有關聯的兩個進程之間通信;2)命名管道以磁盤文件形式存在,通信過程中數據存放在內存緩沖區;3)不支持定位lseek()操作。

無名管道和命名管道的特點對比如表1所示。

4 ?結 ?論

綜上所述,無名管道并不是位于外存的磁盤文件,實際是一個內核緩沖區。無名管道只能應用在有血緣關系的進程之間傳輸數據,它們共享無名管道,通過控制文件描述符來實現對無名管道的訪問。

命名管道雖然被標識成位于外存的一個磁盤文件,但它并不占用磁盤空間,而是與內核緩沖區關聯,利用命名管道通信的進程可以無任何關系,只要進程都能夠通過路徑訪問該命名管道就可以實現通信。不管無名管道還是命名管道在通信過程中,數據都存放在內核緩沖區。無名管道和命名管道互為補充,這樣就讓管道通信體現了其獨有通信優勢。

參考文獻:

[1] 劉玓,陳佳,肖堃,等.Linux操作系統應用編程 [M].北京:人民郵電出版社,2021.

[2] 趙宏,龐偉業,袁繼泉,等.Linux教學中進程之間通過特殊文件通信的解析 [J].計算機時代,2022(10):123-126.

[3] 趙宏,朱忠政,常兆斌.Linux系統教學中關于命名管道文件的解析 [J].軟件,2020,41(2):108-110.

[4] 喬靜,劉寶旨,屈志強,等.Linux中命名管道通信淺析 [J].中國科技信息,2009(20):97-98.

[5] 張龍.Linux下管道通信的實現 [J].企業技術開發,2010,29(19):8-9.

[6] 段瑩,管濤.Linux進程間管道通信的研究 [J].軟件導刊,2012,11(7):3-5.

作者簡介:鄧飛(1972—),男,漢族,四川眉山人,講師,碩士研究生,研究方向:云計算和信息安全;蔡波(1984—),男,漢族,四川南充人,助教,本科,研究方向:計算機網絡和信息安全方向。

主站蜘蛛池模板: 欧美一区二区三区不卡免费| 久久99精品久久久久纯品| 亚洲精品成人7777在线观看| 91精选国产大片| 国产对白刺激真实精品91| 国产午夜看片| 亚洲综合狠狠| 国产网站一区二区三区| 亚洲福利一区二区三区| 久久精品国产在热久久2019| 亚洲AV无码一区二区三区牲色| 欧美一区二区丝袜高跟鞋| 欧美19综合中文字幕| 国产精品香蕉| 精品国产美女福到在线不卡f| 欧美黑人欧美精品刺激| 亚洲色图在线观看| 狠狠亚洲五月天| 欧美精品v欧洲精品| 久久免费观看视频| A级毛片高清免费视频就| 国产成人亚洲毛片| 亚洲第一成年网| 亚洲自偷自拍另类小说| 另类综合视频| 国产精品亚洲精品爽爽| 国产精品一区在线麻豆| 日本国产精品| 一本大道香蕉久中文在线播放| 国产一二三区在线| 97色婷婷成人综合在线观看| 欧美不卡视频一区发布| 午夜影院a级片| 欧美色视频网站| 成人午夜视频网站| 国产成人av大片在线播放| 国产激情第一页| 久久久精品无码一区二区三区| 福利一区三区| 中文字幕欧美日韩高清| 视频二区中文无码| 五月婷婷综合色| 美女无遮挡拍拍拍免费视频| 国产成人高清精品免费5388| 喷潮白浆直流在线播放| 国产福利不卡视频| 日本三级欧美三级| 国产综合精品日本亚洲777| 日韩精品亚洲精品第一页| 国产美女精品在线| 黄色不卡视频| 日韩欧美91| 日本黄色a视频| 亚洲精品成人7777在线观看| 日韩欧美国产精品| 色婷婷电影网| 美女一区二区在线观看| 欧美精品1区| 国产精品亚欧美一区二区| 国产视频你懂得| 亚洲国产中文精品va在线播放| 高潮爽到爆的喷水女主播视频| 中文一级毛片| 粗大猛烈进出高潮视频无码| 国产乱码精品一区二区三区中文 | 欧美综合成人| 无码电影在线观看| 91国内在线视频| 国产青青草视频| 精品人妻系列无码专区久久| 六月婷婷精品视频在线观看 | 国产原创第一页在线观看| 精品91在线| 亚洲熟女中文字幕男人总站| 无码高潮喷水在线观看| 亚洲精品大秀视频| 福利姬国产精品一区在线| 伊人久久婷婷| 久久精品亚洲中文字幕乱码| 伊人久久青草青青综合| 国产精品女熟高潮视频| 无码精品国产dvd在线观看9久|