如何在linux環境下實現程序之間的通訊

時間 2022-02-03 13:10:04

1樓:匿名使用者

linux環境下實現程序之間的通訊主要有以下幾種方式:

# 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。

# 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。

# 訊號量( semophore ) : 訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。

因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。

# 訊息佇列( message queue ) : 訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

# 訊號 ( sinal ) : 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。

#共享記憶體( shared memory):共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的ipc方式,它是針對其他程序間通訊方式執行效率低而專門設計的。

它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步和通訊。

# 套接字( socket ) : 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。

管道的主要侷限性正體現在它的特點上:

只支援單向資料流;

只能用於具有親緣關係的程序之間;

沒有名字;

管道的緩衝區是有限的(管道制存在於記憶體中,在管道建立時,為緩衝區分配一個頁面大小);

管道所傳送的是無格式位元組流,這就要求管道的讀出方和寫入方必須事先約定好資料的格式,比如多少位元組算作一個訊息(或命令、或記錄)等等;

2樓:

假設a程序和b程序進行通訊,則若a程序要告知b程序要b程序呼叫一個函式,則a必須知道b的pid,pid是pid_t型別的,即a裡有pid_t pid = getpid();然後傳給a,讓a知道b的程序號,作為一個全域性變數就行了,其實也沒必要傳遞。(一會說一下怎麼做全域性變數。)在a要b呼叫函式的地方,使用kill函式,

int kill(pid_t pid,int sig);

pid是a的,sig可以隨便寫一個數字,32以內吧,我一般用sigusr1。

呼叫kill之前保證b函式已經執行了signal函式。

signal(int signum,void(* handler)(int));

handler是一個函式名,他有一個引數int型(就是signum),signum要和kill用的一樣。

當a執行kill時,b就會執行handler函式。

下面講一下怎麼使用全域性變數。

例如兩個檔案中要共享一些變數作為全域性變數,然後其中一個宣告變數名稱,另一個如果也宣告的話,在編譯的時候不會出錯,但是在連線的時候就會出錯,這是因為變數名重了,但是你在另一個宣告之前,加一個extern,寫成extern int aa;這是告訴編譯器,編譯可以通過,在別處已經宣告瞭,不是在這裡宣告,連線時候也不錯,用這種辦法就可以多個程序共享很多變數了,更沒有必要把變數當引數傳來傳去,比較麻煩。好了就這些。希望對你有用。

另外,忽然發現,0分唉o_o~~能不能加點

****************************************==

你知道嗎,寫了這麼大一通發現樓主消失了,會不會感到很爽?!!!

3樓:匿名使用者

在parent程序中,列印各程序id printf(

linux系統的程序間通訊有哪幾種方式

4樓:檀香透窗櫺

一、方式

1、管道(pipe)及有名管道( mkpipe):

管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;

2、訊號(signal):

訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身。

linux除了支援unix早期訊號語義函式sigal外,還支援語義符合posix.1標準的訊號函式sigaction。

實際上,該函式是基於bsd的,bsd為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式。

3、訊息佇列(message):

訊息佇列是訊息的連結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

4、共享記憶體:

使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

5、訊號量(semaphore):

主要作為程序間以及同一程序不同執行緒之間的同步手段。

6、套介面(socket):

更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由unix系統的bsd分支開發出來的,但現在一般可以移植到其它類unix系統上:linux和system v的變種都支援套接字。

二、概念

程序間通訊概念:

ipc—-interprocess communication

每個程序各自有不同的使用者地址空間,任何一個程序的全域性變數在另一個程序中都看不到所以程序之間要交換資料必須通過核心。

在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊。

擴充套件資料

1)無名管道:

管道是半雙工的,資料只能向一個方向流動;需要雙方通訊時,需要建立起兩個管道;只能用於父子程序或者兄弟程序之間(具有親緣關係的程序)。

管道對於管道兩端的程序而言,就是一個檔案,但它不是普通的檔案,它不屬於某種檔案系統,構成兩程序間通訊的一個媒介。

資料的讀出和寫入:一個程序向管道中寫的內容被管道另一端的程序讀出。寫入的內容每次都新增在管道緩衝區的末尾,並且每次都是從緩衝區的頭部讀出資料。

2)有名管道:

不同於管道之處在於它提供一個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中。這樣,即使與fifo的建立程序不存在親緣關係的程序,只要可以訪問該路徑,就能夠彼此通過fifo相互通訊(能夠訪問該路徑的程序以及fifo的建立程序之間)。

因此,通過fifo不相關的程序也能交換資料。值得注意的是,fifo嚴格遵循先進先出(first in first out),對管道及fifo的讀總是從開始處返回資料,對它們的寫則把資料新增到末尾。它們不支援諸如lseek()等檔案定位操作。

5樓:匿名使用者

# 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。

# 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。

# 訊號量( semophore ) : 訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。

因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。

# 訊息佇列( message queue ) : 訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

# 訊號 ( sinal ) : 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。

# 共享記憶體( shared memory ) :共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的 ipc 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。

它往往與其他通訊機制,如訊號兩,配合使用,來實現程序間的同步和通訊。

# 套接字( socket ) : 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。

6樓:匿名使用者

管道訊息佇列

unix domain socket

共享記憶體訊號量

linux下c的兩個程序如何實現通訊?一個程序給另一個程序傳送訊息,另一個接受並顯示出來。求大神啊

linux下程序間如何進行通訊

7樓:雲哥

管道(pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;

訊號(signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援unix早期訊號語義函式sigal外,還支援語義符合posix.1標準的訊號函式sigaction(實際上,該函式是基於bsd的,bsd為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);

報文(message)佇列(訊息佇列):訊息佇列是訊息的連結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。

訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

套介面(socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。

linux怎麼停止程序,如何在 Linux 系統中結束結束程序或是中止程式

linux百科 linux查詢程序和結束程序 1.ps ef grep redisps 將某個程序顯示出來 a 顯示所有程式。e 此引數的效果和指定 a 引數相同。f 顯示uid,ppip,c與stime欄位。grep命令是查詢 中間的 是管道命令 是指ps命令與grep同時執行這條命令的意思是顯示...

linux環境下 php如何配置

育知同創教育 linux中配置mysql開發環境的方法 1 安裝mysql roupadd mysql 新增一個mysql組 useradd g mysql mysql 新增一個使用者到mysql組中 tar zxvf mysql 5.0.56.tar.gz cd mysql 5.0.56 cat ...

linux系統下如何安裝軟體,如何在Linux系統中安裝應用軟體

一般用命行,或新立得軟體包管理器 系統 系統管理 新立得軟體包管理器 這樣可以自動解決以來關係。如果是 deb可以雙擊直接安裝。rpm可能需要先安裝rpm包。tar,gz,tar.bz等需先解壓,用cd命令進入資料夾。configure make 如果make失敗,先執行一下sudo apt get...