Linux程序間通訊

2021-05-28 02:59:39 字數 3198 閱讀 3170

程序間通訊 ipc(interprocess communication)基本機制:訊號、管道及命名管道、訊息佇列、共享主存、訊號量、套接字

訊號:全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式、訊號傳送函式和訊號集操作函式。

訊號安裝函式signal(int signum,void(*handler)(int))用來設定某個訊號的處理函式,其中引數signum指出要設定處理函式的訊號,引數handler是處理函式,可以是sig_ign(忽略該訊號)、sig_del(使用預設訊號函式)或自定義訊號處理函式。

訊號傳送函式:訊號發生有兩個** 硬體原因(如按鍵鍵盤),軟體原因(如函式或命令發出訊號)。其中有5個最常見的發出訊號函式 kill()、raise()、alarm()、setitimer()、和pause()。

kill(pid_t pid,int sig) 函式用來想程序傳送乙個訊號。

raise(int sig) 函式用來向自身傳送函式。

alarm(unsigned int seconds) 函式用來設定乙個定時器,當定時器技術到達時,將發出訊號sigalarm給程序,訊號安裝函式接受到該訊號後進行相應的處理。

管道和命名管道:最適合在程序間實現生產者和消費者的互動。管道被看作是開啟的檔案,但在已安裝的檔案系統中沒有相應的映像,使用起來比臨時檔案更方便。

無名管道:只能用於乙個程序家族之間通訊,父子之間,兄弟之間等等,呼叫pipe(int  fds[2]),之後會建立兩個檔案描述符fds[0]和fds[1],其中fds[0]固定用於讀管道,fds[1]固定用於寫管道。呼叫fork()函式後,子程序會繼承父程序所建立的管道,此時父子程序分別擁有自己的讀寫管道,如果將父程序的寫端fds[1]和子程序的讀端fds[0]關閉,則將建立一條「子程序寫入父程序讀出」的通道。

命名管道:克服了匿名管道只能用於具有親緣關係的程序間通訊的限制,命名管道通過mkfifo(my_fifo,o_creat|o_excl)函式建立,之後對命名管道my_fifo的操作可用一般檔案i/o函式。開啟命名管道fd= open(myfifo,o_rdwr)後得到檔案描述符,之後讀寫就可用read(fd,buffer,size)之類函式進行了。

訊息佇列就是訊息的乙個鍊錶,它允許乙個或多個程序向它寫訊息,乙個或多個程序從中讀訊息。linux維護了乙個訊息佇列向量表:msgque,來表示系統中所有的訊息佇列。其定義如下:

struct msqid_ds *msgque[msgmni];

該向量表中的每乙個元素都是乙個指向msqid_ds資料結構的指標,而乙個msqid_ds資料結構完整地描述了乙個訊息佇列。

當建立訊息佇列時,乙個新的msqid_ds資料結構被從系統記憶體中分配出來,並被插入到msgque 向量表中。

訊息佇列的實現包括:建立或開啟訊息佇列、新增訊息、讀取訊息和控制訊息佇列這4個操作。

建立、開啟訊息佇列的函式 msgget();

新增訊息的函式 msgsed();

讀取訊息的函式 msgrcv();

控制訊息佇列的函式 msgctl();

傳送端**:

int main()

exit(0);

}

接受端**:

int main()

while(srtncmp,"quit",4); //檢測訊息前4個字元,如果為「quit」,則退出

msgctl(qid,ipc_rmid,null); //從系統核心中移走訊息佇列

exit(0);

}

共享記憶體:因為所有程序共享同一塊記憶體,共享記憶體在各種程序間通訊方式中具有最高的效率。

程序通過呼叫shmget(key_t key, int size ,int shm***)(shared memory get,獲取共享記憶體)來分配乙個共享記憶體塊。該函式的第乙個引數是乙個用來標識共享記憶體塊的鍵值。彼此無關的程序可以通過指定同乙個鍵以獲取對同乙個共享記憶體塊的訪問。第二個引數為共享記憶體大小。第三個引數 同open()函式的許可權為,也可用八進位制表示法。

要讓乙個程序獲取對一塊共享記憶體的訪問,這個程序必須先呼叫shmat( int shmid , const void  *shmaddr,  int  shm***)(shared memory attach,繫結到共享記憶體)。將 shmget 返回的共享記憶體識別符號 shmid 傳遞給這個函式作為第乙個引數。第二個引數表示將共享記憶體對映到指定位址。

當乙個程序不再使用乙個共享記憶體塊的時候應通過呼叫shmdt( const  void  *shmaddr)(shared memory detach,脫離共享記憶體塊)函式與該共享記憶體塊脫離。引數shmaddr 為被對映的共享記憶體段位址。

訊號量:是用來解決程序間的同步與互斥問題的一種程序間通訊機制,包括乙個稱為訊號量的變數和在該訊號量下等待資源的程序等待佇列,以及對訊號量進行的兩個原子操作(pv操作)。訊號量指的是當前可用的該資源的數量,若它等於0則意味這目前沒有可用的資源。

訊號量程式設計步驟

1)semget(key_t  key,  int   nsms  ,int  sem*** )  建立訊號量或獲取系統已存在的訊號量。

2)semctl( int  semid ,  int  semnum ,  int  cmd,  union  semun  arg)  初始化訊號量。

3)semop(int  semid,  struct  sembuf  *sops,  size_t  nsops)  進行訊號量的pv操作。

4)用semctl()函式刪除不需要的訊號量。

疑問:在 linux 上,有兩類訊號量。

第一類是由 semget/semop/semctl api 定義的訊號量的 svr4(system v release 4)版本。

第二類是由 sem_init/sem_wait/sem_post/inte***ces 定義的 posix 介面。 它們具有相同的功能,但介面不同。

套接字:套接字程式設計模型

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...

Linux 程序間通訊

我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與fifo檔案 乙個原始...