『壹』 linux系統的進程間通信有哪幾種方式
數據傳輸
一個進程需要將它的數據發送給另一個進程,發送的數據量在一個位元組到幾M位元組之間
共享數據
多個進程想要操作共享數據,一個進程對共享數據
通知事
一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程)。
資源共享
多個進程之間共享同樣的資源。為了作到這一點,需要內核提供鎖和同步機制。
進程式控制制
有些進程希望完全控制另一個進程的執行(如Debug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,並能夠及時知道它的狀態改變。
Linux 進程間通信(IPC)的發展
linux下的進程通信手段基本上是從Unix平台上的進程通信手段繼承而來的。而對Unix發展做出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(加州大學伯克利分校的伯克利軟體發布中心)在進程間通信方面的側重點有所不同。
前者對Unix早期的進程間通信手段進行了系統的改進和擴充,形成了「system V IPC」,通信進程局限在單個計算機內;
後者則跳過了該限制,形成了基於套介面(socket)的進程間通信機制。
Linux則把兩者繼承了下來
早期UNIX進程間通信
基於System V進程間通信
基於Socket進程間通信
POSIX進程間通信。
UNIX進程間通信方式包括:管道、FIFO、信號。
System V進程間通信方式包括:System V消息隊列、System V信號燈、System V共享內存
POSIX進程間通信包括:posix消息隊列、posix信號燈、posix共享內存。
由於Unix版本的多樣性,電子電氣工程協會(IEEE)開發了一個獨立的Unix標准,這個新的ANSI Unix標准被稱為計算機環境的可移植性操作系統界面(PSOIX)。現有大部分Unix和流行版本都是遵循POSIX標準的,而Linux從一開始就遵循POSIX標准;
BSD並不是沒有涉足單機內的進程間通信(socket本身就可以用於單機內的進程間通信)。事實上,很多Unix版本的單機IPC留有BSD的痕跡,如4.4BSD支持的匿名內存映射、4.3+BSD對可靠信號語義的實現等等。
linux使用的進程間通信方式
管道(pipe),流管道(s_pipe)和有名管道(FIFO)
信號(signal)
消息隊列
共享內存
信號量
套接字(socket)
管道( pipe )
管道這種通訊方式有兩種限制,一是半雙工的通信,數據只能單向流動,二是只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
流管道s_pipe: 去除了第一種限制,可以雙向傳輸.
管道可用於具有親緣關系進程間的通信,命名管道:name_pipe克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;
信號量( semophore )
信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外介面,用sigaction函數重新實現了signal函數);
消息隊列( message queue )
消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠許可權的進程可以向隊列中添加消息,被賦予讀許可權的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
信號 ( singal )
信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
主要作為進程間以及同一進程不同線程之間的同步手段。
共享內存( shared memory )
共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
套接字( socket )
套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信
更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。
進程間通信各種方式效率比較
類型
無連接
可靠
流控制
記錄消息類型
優先順序
普通PIPE N Y Y N
流PIPE N Y Y N
命名PIPE(FIFO) N Y Y N
消息隊列 N Y Y Y
信號量 N Y Y Y
共享存儲 N Y Y Y
UNIX流SOCKET N Y Y N
UNIX數據包SOCKET Y Y N N
注:無連接: 指無需調用某種形式的OPEN,就有發送消息的能力流控制:
如果系統資源短缺或者不能接收更多消息,則發送進程能進行流量控制
各種通信方式的比較和優缺點
管道:速度慢,容量有限,只有父子進程能通訊
FIFO:任何進程間都能通訊,但速度慢
消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題
信號量:不能傳遞復雜消息,只能用來同步
共享內存區:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於線程中的線程安全,當然,共享內存區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存
如果用戶傳遞的信息較少或是需要通過信號來觸發某些行為.前文提到的軟中斷信號機制不失為一種簡捷有效的進程間通信方式.
但若是進程間要求傳遞的信息量比較大或者進程間存在交換數據的要求,那就需要考慮別的通信方式了。
無名管道簡單方便.但局限於單向通信的工作方式.並且只能在創建它的進程及其子孫進程之間實現管道的共享:
有名管道雖然可以提供給任意關系的進程使用.但是由於其長期存在於系統之中,使用不當容易出錯.所以普通用戶一般不建議使用。
消息緩沖可以不再局限於父子進程,而允許任意進程通過共享消息隊列來實現進程間通信,並由系統調用函數來實現消息發送和接收之間的同步,從而使得用戶在使用消息緩沖進行通信時不再需要考慮同步問題,使用方便,但是信息的復制需要額外消耗CPU的時間,不適宜於信息量大或操作頻繁的場合。
共享內存針對消息緩沖的缺點改而利用內存緩沖區直接交換信息,無須復制,快捷、信息量大是其優點。
但是共享內存的通信方式是通過將共享的內存緩沖區直接附加到進程的虛擬地址空間中來實現的,因此,這些進程之間的讀寫操作的同步問題操作系統無法實現。必須由各進程利用其他同步工具解決。另外,由於內存實體存在於計算機系統中,所以只能由處於同一個計算機系統中的諸進程共享。不方便網路通信。
共享內存塊提供了在任意數量的進程之間進行高效雙向通信的機制。每個使用者都可以讀取寫入數據,但是所有程序之間必須達成並遵守一定的協議,以防止諸如在讀取信息之前覆寫內存空間等競爭狀態的出現。
不幸的是,Linux無法嚴格保證提供對共享內存塊的獨占訪問,甚至是在您通過使用IPC_PRIVATE創建新的共享內存塊的時候也不能保證訪問的獨占性。 同時,多個使用共享內存塊的進程之間必須協調使用同一個鍵值。
『貳』 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形式之一。