• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Linux系統(tǒng)教學(xué)中關(guān)于命名管道文件的解析

      2020-06-09 12:20趙宏朱忠政常兆斌
      軟件 2020年2期

      趙宏 朱忠政 常兆斌

      摘 ?要: 針對(duì)Linux系統(tǒng)相關(guān)內(nèi)容教學(xué)中對(duì)于命名管道文件講述不夠詳細(xì),導(dǎo)致學(xué)生對(duì)命名管道文件認(rèn)識(shí)模糊的問題,基于Linux系統(tǒng)進(jìn)程之間通信機(jī)制,講述了進(jìn)程之間通過管道通信的原理、無名管道和命名管道的功能,并通過實(shí)例說明了命令方式和程序方式使用命名管道的方法。

      關(guān)鍵詞:?Linux系統(tǒng);文件權(quán)限;命名管道;Python

      中圖分類號(hào): TP301????文獻(xiàn)標(biāo)識(shí)碼:?A????DOI:10.3969/j.issn.1003-6970.2020.02.023

      【Abstract】: Most university students have the vague knowledge of named pipe file in Linux learning because the detailed explain about the named pipe is absent in Linux teaching files. Communicate principle between processes, functions of anonymous pipe and named pipe are discussed in detailed. Examples are presented in command and program modes to illustrate the usage of named pipe.

      【Key words】: Linux system; File permission; Named pipe; Python

      0??引言

      Linux系統(tǒng)作為開放源代碼和自由軟件的代表,廣泛應(yīng)用在各行各業(yè),運(yùn)行在各種機(jī)型和硬件平臺(tái)上[1,2]。Linux系統(tǒng)符合POSIX(Portable Operating System Interface)標(biāo)準(zhǔn),功能強(qiáng)大,效率高,配置靈活,安全性高,且具有豐富的工具軟件和應(yīng)用軟件,其相關(guān)內(nèi)容在大多數(shù)高校信息類專業(yè)中作為專業(yè)基礎(chǔ)課開設(shè)[3,4],例如《Linux操作系統(tǒng)》、《Linux系統(tǒng)內(nèi)核分析》、《Linux系統(tǒng)程序設(shè)計(jì)》等。

      在Linux系統(tǒng)相關(guān)內(nèi)容教學(xué)中,系統(tǒng)中的文件類型是基本內(nèi)容,大多數(shù)教科書列舉了Linux中的文件類型,包括普通文件(-)、目錄文件(d)、字符設(shè)備文件(c)、塊設(shè)備文件(b)、符號(hào)鏈接文件(l)、命名管道文件(p)和套接字文件(s)等七種文件類型[1,4],對(duì)于前五種文件,一般都進(jìn)行了詳細(xì)描述,并用實(shí)例加以說明,但對(duì)于后兩種文件,只是進(jìn)行簡(jiǎn)單的描述,也沒有實(shí)例的說明。學(xué)生在學(xué)習(xí)中,對(duì)于命名管道文件和套接字文件的認(rèn)識(shí)很模糊,不利于對(duì)Linux系統(tǒng)的深刻理解。

      本文基于Linux系統(tǒng)進(jìn)程間通信機(jī)制,討論進(jìn)程間通過管道通信的方法,并通過實(shí)例進(jìn)行詳細(xì)說明,加深學(xué)生對(duì)命名管道文件的認(rèn)識(shí)。

      1??進(jìn)程間管道通信方法

      Linux系統(tǒng)中進(jìn)程間通過管道通信時(shí),將一個(gè)進(jìn)程的輸出作為另一個(gè)進(jìn)程的輸入。其本質(zhì)是在內(nèi)存中創(chuàng)建一個(gè)緩沖區(qū),對(duì)緩存區(qū)中的數(shù)據(jù)以先進(jìn)先出FIFO(First Input,F(xiàn)irst Output)的形式進(jìn)行操作,就好像先進(jìn)入管道的水會(huì)先流出,后進(jìn)入管道的水會(huì)后流出,管道是對(duì)緩存區(qū)數(shù)據(jù)操作方式的形象稱謂。

      實(shí)現(xiàn)管道功能的內(nèi)存緩存區(qū)被設(shè)計(jì)成環(huán)形的數(shù)據(jù)結(jié)構(gòu),便于循環(huán)使用。當(dāng)緩存區(qū)中沒有數(shù)據(jù)時(shí),從緩存區(qū)讀取數(shù)據(jù)的進(jìn)程會(huì)被阻塞,直到緩存區(qū)中有數(shù)據(jù),同理,當(dāng)緩存區(qū)中充滿數(shù)據(jù)時(shí),給緩存區(qū)寫入數(shù)據(jù)的進(jìn)程會(huì)被阻塞,直到緩存區(qū)中有空閑空間保存寫入的數(shù)據(jù)。當(dāng)讀寫管道的進(jìn)程結(jié)束時(shí),為管道創(chuàng)建的緩存區(qū)也被系統(tǒng)回收。

      1.1??無名管道

      同一個(gè)用戶創(chuàng)建的多個(gè)進(jìn)程之間利用管道進(jìn)行通信時(shí),由于為管道創(chuàng)建的內(nèi)存緩存區(qū)供同一個(gè)用戶的進(jìn)程訪問,不需要用戶身份和操作權(quán)限的鑒別,因此,對(duì)內(nèi)存緩存區(qū)不需要進(jìn)行特殊的標(biāo)注,故稱為無名管道。

      無名管道常用于Linux的命令中,用“|”表示,將一個(gè)命令的輸出結(jié)果作為另一個(gè)命令的輸入。例如“l(fā)s –l | more”,命令“l(fā)s -l”和“more”會(huì)各自創(chuàng)建一個(gè)進(jìn)程,這兩個(gè)進(jìn)程屬于執(zhí)行命令的當(dāng)前用戶,為命令“l(fā)s -l”創(chuàng)建的進(jìn)程將命令的執(zhí)行結(jié)果數(shù)據(jù)以管道的形式傳遞給為命令“more”創(chuàng)建的進(jìn)程,后者進(jìn)程對(duì)收到的數(shù)據(jù)在屏幕上進(jìn)行分頁顯示,實(shí)現(xiàn)了前者命令結(jié)果分頁顯示的效果。

      1.2??命名管道

      不同用戶創(chuàng)建的進(jìn)程之間利用管道進(jìn)行通信時(shí),由于為管道創(chuàng)建的內(nèi)存緩存區(qū)要同時(shí)供不同用戶的進(jìn)程進(jìn)行操作,按照Linux系統(tǒng)嚴(yán)格的用戶身份和操作權(quán)限的規(guī)則,需要對(duì)操作內(nèi)存緩存區(qū)的用戶身份和操作權(quán)限進(jìn)行鑒別。

      Linux的文件系統(tǒng)具有完善的用戶身份和操作權(quán)限的鑒權(quán)機(jī)制,將文件的操作分為讀(r, read)、寫(w, write)和執(zhí)行(x, execute)等三種權(quán)限;將操作文件的用戶分為文件主(u, user)、同組用戶(g, group)和其他用戶(o, other)等三種角色。對(duì)一個(gè)文件而言,不同角色的用戶對(duì)文件具有不同的操作權(quán)限,保證了操作的安全性。

      為不同用戶進(jìn)程之間通信的管道,借鑒Linux文件系統(tǒng)的用戶身份和操作權(quán)限的鑒權(quán)機(jī)制,賦予管道一個(gè)文件名,按照文件系統(tǒng)的鑒權(quán)機(jī)制對(duì)管道操作,因此,稱為命名管道。

      2??進(jìn)程間管道通信方法

      在Ubuntu 18.10系統(tǒng)中創(chuàng)建用戶user1和user2,在user1家目錄下創(chuàng)建子目錄named_pipe,在named_pipe子目錄下利用命令mkfifo創(chuàng)建命名管道文件a.pipe,如圖1所示。

      圖1中,命名管道文件a.pipe的類型為“p”,表明該文件為命名管道文件;文件主為user1,文件主對(duì)該文件的操作權(quán)限為“rw-”,表示文件主可以對(duì)這個(gè)命名管道進(jìn)行讀和寫;文件所屬組為user1,同組用戶對(duì)該文件的操作權(quán)限為“rw-”,表示屬于user1組的用戶對(duì)這個(gè)命名管道進(jìn)行讀和寫;其他用戶對(duì)該文件的操作權(quán)限為“r--”,表示其他用戶對(duì)這個(gè)命名管道只能進(jìn)行讀操作。命名管道文件為特殊的文件,其中不保存數(shù)據(jù),所以,文件字節(jié)數(shù)為零。命名管道文件的操作權(quán)限,規(guī)定了系統(tǒng)中用戶對(duì)與該命名管道文件綁定的內(nèi)存緩存區(qū)訪問的鑒權(quán)。

      2.1??命令使用命名管道文件

      為用戶user1和user2各打開一個(gè)終端命令窗口,在user1用戶的窗口中運(yùn)行命令“l(fā)s -l>~/named_?pipe/a.pipe”,利用輸出重定向?qū)⒚畹膱?zhí)行結(jié)果輸出給命名管道,其中,~代表用戶的家目錄;在user2用戶的窗口中運(yùn)行命令“cat ~user1/named_pipe/?a.pipe”,利用命令cat讀取屬于user1的命名管道文件a.pipe。

      先執(zhí)行命令的窗口中的進(jìn)程將被阻塞,直到另一個(gè)窗口中命令輸入完畢并回車。將在user2用戶的窗口中顯示user1窗口執(zhí)行的命令的結(jié)果,如圖2所示。

      該例利用命名管道實(shí)現(xiàn)了user1和user2進(jìn)程之間的通信,其中,user1的進(jìn)程向命名管道寫入數(shù)據(jù),user2的進(jìn)程從命名管道讀取數(shù)據(jù);user1作為文件主對(duì)命名管道具有寫權(quán)限,user2作為其他用戶對(duì)命名管道具有讀權(quán)限,符合a.pipe的權(quán)限規(guī)定。

      如果在user2用戶的窗口中運(yùn)行命令“l(fā)s -l >~ user1/named_pipe/a.pipe”,則收到“權(quán)限不夠”的提示,如圖3所示,因?yàn)閡ser2作為其他用戶,對(duì)a.pipe沒有寫權(quán)限。

      如果將用戶user2加入user1組,使user2成為a.pipe的同組用戶,則user2運(yùn)行命令“l(fā)s -l>~ user1/?named_pipe/a.pipe”會(huì)成果,因?yàn)橥M用戶對(duì)a.pipe具有寫權(quán)限。

      2.2??程序使用命名管道文件

      Python語言語法簡(jiǎn)潔,語義清晰,有非常豐富和強(qiáng)大庫的支持,廣泛應(yīng)用在數(shù)據(jù)處理、科學(xué)計(jì)算、圖形圖像處理、機(jī)器學(xué)習(xí)、網(wǎng)絡(luò)編程、多媒體處理、系統(tǒng)運(yùn)維、游戲服務(wù)器端開發(fā)等多個(gè)領(lǐng)域,是目前最流行的計(jì)算機(jī)編程語言之一[5]。本例選用Python編程語言實(shí)現(xiàn)。

      在用戶user1家目錄下創(chuàng)建Python程序文件,pipe01.py,代碼如下。

      1 ?#!/usr/bin/env

      2 ?# coding: utf-8

      3 ?#pipe01.py

      4 ?f=open('/home/user1/named_pipe/a.pipe',?'w')

      5 ?f.write('Hello, I am user1!')

      6 ?f.close()

      在用戶user2家目錄下創(chuàng)建Python程序文件,pipe02.py,代碼如下。

      1 ?#!/usr/bin/env

      2 ?# coding: utf-8

      3 ?# pipe02.py

      4 ?f=open('/home/user1/named_pipe/a.pipe',?'r')

      5 ?info=f.read()

      6 ?print(info)

      7 ?f.close()

      pipe01.py和pipe02.py中代碼前的行號(hào)是為敘述方便而加的,以#開頭的代碼為注釋,不執(zhí)行。

      pipe01.py的第4行代碼以寫的方式打開命名管道文件,第5行代碼給打開的文件寫入字符串“Hello,I am user1!”,第6行代碼關(guān)閉打開的文件。

      pipe02.py的第4行代碼以讀的方式打開命名管道文件,第5行代碼從打開的文件讀取數(shù)據(jù)到變量info中,第6行代碼輸出變量info的內(nèi)容,第7行代碼關(guān)閉打開的文件。

      在user1用戶的窗口中運(yùn)行命令“python pipe01.?py”,通過程序向命名管道文件寫入數(shù)據(jù);在user2用戶的窗口中運(yùn)行命令“python pipe02.py cat”,通過程序從命名管道文件讀取數(shù)據(jù)。在user2用戶的窗口中將會(huì)顯示“Hello, I am user1!”。

      該例以程序的形式,利用命名管道實(shí)現(xiàn)了user1和user2進(jìn)程之間的通信,其中,user1的進(jìn)程向命名管道寫入數(shù)據(jù),user2的進(jìn)程從命名管道讀取數(shù)據(jù);user1作為文件主對(duì)命名管道具有寫權(quán)限,user2作為其他用戶對(duì)命名管道具有讀權(quán)限,符合文件a.pipe的權(quán)限規(guī)定。

      如果用戶user2要向a.pipe中寫入數(shù)據(jù),必須要具備寫權(quán)限,否則,系統(tǒng)會(huì)給出沒有操作權(quán)限的提示。

      3??結(jié)束語

      命名管道文件是Linux系統(tǒng)的七種文件之一,也是不同用戶進(jìn)程之間通信的一種手段,在Linux系統(tǒng)中具有重要作用。本文基于Linux系統(tǒng)進(jìn)程之間通信的機(jī)制,討論了進(jìn)程之間通過管道通信的本質(zhì),并給出利用命令和程序?qū)崿F(xiàn)不同用戶進(jìn)程之間通過命名管道通信的實(shí)例

      參考文獻(xiàn)

      鳥哥. 鳥哥的Linux私房菜基礎(chǔ)學(xué)習(xí)篇(第四版)[M]. 北京: 人民郵電出版社, 2018, 10.

      Machtelt Garrels. Introduction to Linux[EB/OL]. (2010-05-?12) [2019-09-27]. http://tille.garrels.be/training/tldp/.

      燕彩蓉, 朱黎華, 劉瑜琪, 等. 新工科背景下Linux系統(tǒng)課程教學(xué)研究[J]. 計(jì)算機(jī)教育, 2019(6): 152-156.

      吳淑泉. 高?!癓inux操作系統(tǒng)”課程教學(xué)研究與探索[J]. 教育理論與實(shí)踐, 2017, 37(33): 57-58.

      趙宏, 包廣斌, 馬棟林. Python網(wǎng)絡(luò)編程(Linux)[M]. 北京: 清華大學(xué)出版社, 2018, 10.

      达日县| 南乐县| 多伦县| 微博| 育儿| 杭锦旗| 专栏| 交城县| 额尔古纳市| 广河县| 崇文区| 牙克石市| 常山县| 凤山市| 西乌珠穆沁旗| 锡林郭勒盟| 临清市| 五河县| 湘乡市| 青海省| 荆州市| 老河口市| 双牌县| 泾阳县| 白朗县| 德阳市| 资兴市| 清丰县| 松溪县| 开江县| 阳朔县| 旌德县| 肇州县| 西藏| 定安县| 周宁县| 敖汉旗| 南昌市| 灵川县| 德钦县| 海门市|