導航:首頁 > 操作系統 > linux雙向管道

linux雙向管道

發布時間:2022-09-26 14:32:06

『壹』 linux系統的進程間通信有哪幾種方式

『貳』 linux:無名管道通信實驗

#include<unistd.h>
#include<stdio.h>

//警告:該程序未做錯誤驗證,未關閉管道(由系統自動關閉)

intmain()
{
intp2c[2];//該管道父進程寫,子進程讀
intc2p[2];//該管道子進程寫,父進程讀

//創建2條管道
pipe(p2c);
pipe(c2p);

intpid=fork();
intfd_read,fd_write;//這兩個描述符用於保存某進程讀端和寫端
intpid_my;//保存某進程自身的pid
intpid_other;//另一進程的pid,通過

if(pid==0){//子進程
fd_read=p2c[0];
fd_write=c2p[1];
//通過getpid取得自身pid,寫到管道里
pid_my=getpid();

write(fd_write,&pid_my,sizeof(int));
//從另一管道讀取另一進程的pid
read(fd_read,&pid_other,sizeof(int));
//列印讀取到的pid
printf("Recivepid:%d ",pid_other);
}else{ //p
fd_read=c2p[0];
fd_write=p2c[1];
pid_my=getpid();
//由於子進程是先寫自身pid,父進程最好先讀取子進程的pid
read(fd_read,&pid_other,sizeof(int));
write(fd_write,&pid_my,sizeof(int));

printf("Recivepid:%d ",pid_other);
}

return0;
}

『叄』 Linux系統編程—管道

Linux 實現 IPC 其中的一種方式——管道
管道又分:
1、無名管道:無名管道只能用於有親緣關系的進程。
2、有名管道:有名管道用於任意兩進程間通信。

你就可以把管道理解成位於進程內核空間的「文件」。

給文件加引號,是因為它和文件確實很像,因為它也有描述符。但是它確實又不是普通的本地文件,而是一種抽象的存在。

當進程使用 pipe 函數,就可以打開位於內核中的這個特殊「文件」。同時 pipe 函數會返回兩個描述符,一個用於讀,一個用於寫。如果你使用 fstat函數來測試該描述符,可以發現此文件類型為 FIFO。

而無名管道的無名,指的就是這個虛幻的「文件」,它沒有名字。本質上,pipe 函數會在進程內核空間申請一塊內存(比如一個內存頁,一般是 4KB),然後把這塊內存當成一個先進先出(FIFO)的循環隊列來存取數據,這一切都由操作系統幫助我們實現了。

pipe 函數打開的文件描述符是通過參數(數組)傳遞出來的,而返回值表示打開成功(0)或失敗(-1)。
它的參數是一個大小為 2 的數組。此數組的第 0 個元素用來接收以讀的方式打開的描述符,而第 1 個元素用來接收以寫的方式打開的描述符。也就是說,pipefd[0] 是用於讀的,而 pipefd[1] 是用於寫的。
打開了文件描述符後,就可以使用 read(pipefd[0]) 和 write(pipefd[1]) 來讀寫數據了。

注意事項
1、這兩個分別用於讀寫的描述符必須同時打開才行,否則會出問題。
2、如果關閉讀 (close(pipefd[0])) 端保留寫端,繼續向寫端 (pipefd[1]) 端寫數據(write 函數)的進程會收到 SIGPIPE 信號。
3、如果關閉寫 (close(pipefd[1])) 端保留讀端,繼續向讀端 (pipefd[0]) 端讀數據(read 函數),read 函數會返回 0。

當在進程用 pipe 函數打開兩個描述符後,我們可以 fork 出一個子進程。這樣,子進程也會繼承這兩個描述符,而且這兩個文件描述符的引用計數會變成 2。

如果你需要父進程向子進程發送數據,那麼得把父進程的 pipefd[0] (讀端)關閉,而在子進程中把 pipefd[1] 寫端關閉,反之亦然。為什麼要這樣做?實際上是避免出錯。傳統上 pipe 管道只能用於半雙工通信(即一端只能發,不能收;而另一端只能收不能發),為了安全起見,各個進程需要把不用的那一端關閉(本質上是引用計數減 1)。
步驟一:fork 子進程

步驟二:關閉父進程讀端,關閉子進程寫端

父進程 fork 出一個子進程,通過無名管道向子進程發送字元,子進程收到數據後將字元串中的小寫字元轉換成大寫並輸出。

有名管道打破了無名管道的限制,進化出了一個實實在在的 FIFO 類型的文件。這意味著即使沒有親緣關系的進程也可以互相通信了。所以,只要不同的進程打開 FIFO 文件,往此文件讀寫數據,就可以達到通信的目的。

1、文件屬性前面標注的文件類型是 p
2、代表管道文件大小是 0
3、fifo 文件需要有讀寫兩端,否則在打開 fifo 文件時會阻塞

通過命令 mkfifo 創建

通過函數 mkfifo創建

函數返回 0 表示成功,-1 失敗。
例如:

cat 命令列印 test文件內容

接下來你的 cat 命令被阻塞住。
開啟另一個終端,執行:

然後你會看到被阻塞的 cat 又繼續執行完畢,在屏幕列印 「hello world」。如果你反過來執行上面兩個命令,會發現先執行的那個總是被阻塞。

有兩個程序,分別是發送端 send 和接收端面 recv。程序 send 從標准輸入接收字元,並發送到程序 recv,同時 recv 將接收到的字元列印到屏幕。
發送端

接收端

編譯

運行

因為 recv 端還沒打開test文件,這時候 send 是阻塞狀態的。
再開啟另一個終端:

這時候 send 端和 recv 端都在終端顯示has opend fifo
此時在 send 端輸入數據,recv 列印。

『肆』 如何才能在linux下建立全雙工管道

只要理解了什麼是管道,就很簡單了 管道「| 」就是將前面命令輸出作為管道後面命令的輸入 如: ls -a | grep test | awk "{print $1}" 就是將ls -a 顯示的結果,在帥選出含有test,然後列印出第一列。

『伍』 linux有名管道是雙工通信嗎

# 管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。 # 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。

『陸』 到底linux下的管道是什麼

簡單來說,管道是一種兩個進程間進行單向通信的機制。因為管道傳遞數據的單向性,管道又稱為半雙工管道。管道的這一特點決定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一。

『柒』 linux的三種管道機制分別是什麼

Linux 是一套 Unix-like 的操作系統,是 Unix 的一種,它控制整個系統基本服務的核心程序 (kernel) 是由 Linus 帶頭開發出來的,「Linux」這個名稱便是以「Linus's unix」來命名,Linus 選擇用「大眾公有版權」 (GPL)的方式來發行這份程序,這個版權允許任何人以任何形式復制與散布 Linux 的原始程序,換句話說,Linux 實際上是「免費的」,使用者在網路上就可以抓到 Linux 的原始程序代碼,隨心所欲的復制與更改 Linux 的原始程序,在網際網路的日漸盛行以及 Linux 開放自由的版權之下,吸引了無數計算機高手投入開發、改善 Linux 的核心程序,使得 Linux 的功能日見強大,所以今日我們可以在網路上免費下載 Linux 使用,或者花很少的一點費用就可以取得 Linux 光碟,這都是因為 Linux 是 GPL 版權的緣故。

除了核心程序以外,一個操作系統還需要其它的系統程序跟應用程序才有實用性,Linux 系統中常用的系統程序大部份是美國自由軟體基金會 (Free Software Foundation) 開發出來的軟體,而且也有不少機構或個人為 Linux 開發應用程序,這些程序一樣大多都是自由軟體,任何人都可以免費的在網路上取得,不過自行去取得這些程序再一一安裝非常不便,於是有些公司或團體就會去搜集、整合 Linux 上的程序,把「核心-系統程序-應用程序」總合起來構成一個完整的操作系統,讓一般使用者可以簡便的安裝完整個系統,這就是所謂的「安裝軟體包」(distribution),我們一般講的 Linux 系統便是針對這些安裝軟體包而言,同樣是 Linux 系統,卻分成不同公司、機構整合出來的不同安裝軟體包,這就是大家常常在網路上看到 Linux 有那麼多「種」的原因。

Linux 具有 Unix 系統的程序介面跟操作方式,也繼承了 Unix 穩定有效率的特點。網路上安裝 Linux 的主機連續運做一年以上而不曾當機、不必關機是稀鬆平常的事,不過 Linux 卻不象一般 Unix 要負擔龐大的版權費用,也不需要在專屬的昂貴硬體上才可以使用;Linux 可以在一般的 i386 PC 上執行,效能又高,自然而然的接收了過去幾十年來在 Unix 上累積的程序資源跟使用者,加上 GPL 的版權允許大家自由散布 Linux 的原始碼,並針對自己的需求修改程序,使得 Linux 在目前已經成為非常受人歡迎的一個多人多任務、免費、穩定、效率高、可以在包括 i386、Sparc、Alpha、Mips、PPC 等眾多不同計算機系統平台上執行的操作系統。

Linux支持多種硬體裝置,諸如x86、Motorola 68k、Digital Alpha、Sparc、Mips、Motorola PowerPC和ARM等等。由於程序代碼公開,硬體廠商無須多付額外的版權費用,便得以替自行生產的硬體裝置開發適用於Linux的驅動程序,提高產品銷售率。

軟 體方面,如X,為窗口系統的工業標准;另外,由理察·史托曼主導的Emacs,提供窗口版和文字版的文書編輯環境,功能復雜強大,有一套完整的在線說明檔 案;而眾人合作開發的SpreadSheet,是窗口版的電子表格,任何熟稔Lotus 1-2-3的人,看到這樣豐碩的成果,都會有莫名的感動的。當然,最為人稱道的,是Linux的網路能力,不論是SLIP、PPP、NetBEUI、 DDP、X.25還是ISDN等等,Linux都有相應的軟體供應;而穩定的伺服器功能,適用於架設Intranet和Internet。

一般用戶受益於GNU GPL和LGPL的保護,可以不同的管道取得完整的Linux,故而Linux可以是「免費的(gratis)」。相對於Unix昂貴的版權費用,Linux稱得上是物美價廉。

除此以外,Linux還具有如下的特色∶

· 具備多人多任務∶這表示Linux可以在同一段時間內服務許多人各別的需求。形象一點講,你可以一邊聽鐵達尼號的原聲CD,一邊編輯文書,一邊又在列印檔案,還可以隨時玩X版的俄羅斯方塊。

· 支持多CPU∶這絕對不是NT的專利,Linux也支持這種硬體架構,代表著更快速的運算和革命性的演算法即將成為時代的主流。

· RAM保護模式∶程序(processes)之間不會互相干擾,保證系統能常久運作無誤。根據許多人下載系統評量程序(benchmarks)以測試 Linux的執行效能,結果發現單單是配備486CPU的PC,效能便足堪媲美升陽(Sun)或是迪吉多的中級工作站了。

· 動態載入程序∶當程序載入RAM執行時,Linux僅將磁碟中相關的程序模塊載入,有效地提升了執行的速率和RAM的管理。

· 動態連結共享程序館∶這表示執行檔的大小大量地減少,有助於節省磁碟空間。

· 支持多種檔案系統∶如Minix、Xenix、System V等等著名的操作系統。將來NT的NTFS也會列入支持的。

· 看得見DOS∶這是所謂的透明化(transparency);把DOS的FAT檔案系統視為特殊的遠程檔案系統,不需任何特別的指令便可以靈活運用,就如同一個在Linux底下存在的目錄一樣。

Linux的發展

近幾年的發展,已使得Linux成為微軟、升陽的另一大敵手。Linux挾其價格低廉、品質良好與穩定的競爭優勢,正無形無影地擴散至眾多以PC為主的工作 平台上。早期因缺乏商業性應用軟體,單憑學術味道濃厚的工具程序,是無法打入一般商家的主流操作系統的。然而,今日的Linux已非吳下阿蒙,KDE、 Gimp、Gnome等計劃相繼地開展,為X提供了更多圖形介面的桌面操作環境和應用軟體。

約1993年左右,Linux首先以發行軟 體(distribution)的型態出現。這是一群完整的軟體,包含安裝程序、核心、應用軟體、X、驅動程序等的軟體包,經由Internet下載至磁 碟片進行安裝。那時的安裝程序簡陋,難以成功地安裝妥當,介面親和力不足和硬體支持不良是最大的障礙。

後來出現了光碟機,光碟片的傳播媒體也應運而生,現今Linux廠商所製作的發行軟體也都是以此為主要的發行媒介。國內常見的有Red Hat、Slackware和Debian這三種。其中以Debian算是至今仍維持非商業型態的重量級發行軟體了,FSF曾經以基金援助過其初階段的發展。任何人都可以從Debian的FTP站上下載整套的發行軟體。當然,象Red Hat這樣的商業組織,Red Hat發行軟體一樣也可以從FTP站上下載,不過如果花一點小錢買光碟片的話,就可以得到額外的技術支持和有用的說明檔案。

要得到這些光碟片,最簡單的方法便是買有關Linux的書籍,不論中文版或是英文版的書本,書背面都會附上一片載有該公司或組織所製作的發行軟體。一般書內多會有專章講解安裝和設定的過程,讀者可善加利用。不同的發行軟體有不同的安裝機制,然而都是Linux。

對國內用戶而言,最關切的莫過於Linux中文技術的發展情況了。X窗口系統已有穩定的中文版問世,各種中文輸入法和中文模擬窗口也已進入成熟的階段,相信未來會朝向應用軟體中文化的層面發展,使X的操作環境符合國內用戶的需求。

Linux的應用

沒有商業活動,就沒有Linux;沒有信息自由的自覺,更不可能有Linux。

Linux除了是優良的軟體開發平台之外,也是工作、家居的好夥伴。有人說∶「有了Linux,就等於有了阿拉神燈。」此言不假矣。又有人說∶「到現在還沒有移植到Linux的軟體,肯定是一點價值也沒有的。」這話也不差呀。

Linux的發展證實了信息會愈來愈便宜的趨勢;因為便宜,市場便無限擴張。商業活動也轉向為以服務為導向的型態。最直接的案例便是ISP的應用。

Linux可以用來架設ISP!

Linux Journal的發行人SSC(Specialized System Consultants)便是以Linux做為網路撥接服務平台的。要成為ISP業者,需要有連接至網際網路的能力,多序列阜撥接服務(如 Cycades、Maxspeed、Gtek等公司所提供的軟體系統),PPP和SLIP的服務,Usenet新聞群組(如INN),郵件遞送(如 sendmail),網頁伺服器(如Apache),備份功能(如tar、cpio)等等的應用軟體。由此觀察,主要的控製成本會落在網際網路的通訊租費 上,投資Linux的費用是非常低的。

本文摘錄自「 Official CLE 0.8 — 中文 Linux 延伸軟體包使用指南

大力發展linux軟體事業,有助於我國自主軟體的開發,保護國家信息安全,並且在國際競爭中贏得一點份額

『捌』 什麼是linux管道,windows下有管道類似的東西嗎

管道是一種進程間通信機制,好比一個管子,一邊一個口,一個往裡放,另一頭可以往出取,操作是雙向的
windows也有這樣的東西Pipe

『玖』 linux中的管道的本質到底是什麼呢

簡單來說,管道是一種兩個進程間進行單向通信的機制。因為管道傳遞數據的單向性,管道又稱為半雙工管道。管道的這一特點決定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一。

閱讀全文

與linux雙向管道相關的資料

熱點內容
程序員用得到數字區嗎 瀏覽:174
python求商 瀏覽:477
ipad能用c語言編譯器嗎 瀏覽:561
軟泥解壓球最新版 瀏覽:998
4萬程序員辭職創業 瀏覽:759
thinkingphp 瀏覽:597
安卓相冊移動文件夾 瀏覽:6
耳朵清潔解壓聲控99的人都睡得著 瀏覽:205
叉車出租網站源碼 瀏覽:874
共享單車的app是什麼 瀏覽:408
不帶gui的伺服器什麼意思 瀏覽:373
金剛經及PDF 瀏覽:102
php中冒號 瀏覽:358
php5432 瀏覽:352
命令在哪使用 瀏覽:172
php獲取網頁元素 瀏覽:708
為什麼需要硬體驅動編譯 瀏覽:885
pm編程怎樣看導柱孔對不對稱 瀏覽:138
農業大學選課找不到伺服器怎麼辦 瀏覽:660
路由配置網關命令 瀏覽:935