sys/ipc.h

sys/ipc.h是一種通訊格式,可在2個(多數情況下)或多個進程間傳遞信息。

基本介紹

  • 中文名:進程間通訊
  • 格式:sys/ipc.h
  • 檔案形式:由進程自己決定
  • 性質:通訊格式
進程間通訊(IPC)頭檔案,檔案形式的IPC,匿名管道,命名管道,信號,訊息佇列(message queue),共享記憶體(shared memory),信號量(semaphore),

進程間通訊(IPC)頭檔案

所謂進程間通訊,顧名思義,方法大致如下幾種:
1, 檔案(file),匿名管道(anonymous pipe),命名管道(named pipe),信號(signal).
2、 System V IPC 包括訊息佇列(message queue),共享記憶體(shared memory),信號量(semaphore)。這種形式的ipc首先在UNIX分支system V中使用,多數unix系統都支持。

檔案形式的IPC

進程(process) A寫信息到檔案1,進程B讀檔案1。檔案的內容,由進程自己決定。

匿名管道

command1 args1 | command2 args2. 最常見的例子:ls ?l |more 由於管道操作由shell代替完成,沒有產生有名字的實體,所以稱為匿名管道。 Shell做的事情是調用pipe(),產生一個管道,然後把command1的輸出連線到管道的輸入端,把command2的輸入連線到管道的輸出端。

命名管道

首先,建立一個特殊檔案,mkfifo pipe1或者mknod fifo1 p
然後,就當作正常檔案讀寫pipe。
由於產生有名字的實體,所以被稱為命名管道

信號

簡單的用法: kill ?USER2 pid,也就是通過kill()系統調用或者kill命令,傳送信號到別的進程。各個進程對於信號的處理過程是自己定義的(除了Array,也就是KILL是強制的)。比如自己可以忽略HUP,TERM,INT(按control-C), 等。

訊息佇列(message queue)

訊息佇列,是一個佇列的結構,佇列裡面的內容由用戶進程自己定義。實際上,佇列裡面記錄的是指向用戶自定義結構的指針和結構的大小。要使用message queue,首先要通過系統調用(msgget)產生一個佇列,然後,進程可以用msgsnd傳送訊息到這個佇列,訊息就是如上所說的結構。別的進程用msgrcv讀取。訊息佇列一旦產生,除非明確的刪除(某個有許可權的進程或者用ipcrm命令)或者系統重啟。否則,產生的佇列會一直保留在系統中。而且,只要有許可權,就可以對佇列進行操作。訊息佇列和管道很相似,實際上,管道就是用戶訊息為1個位元組的佇列。

共享記憶體(shared memory)

共享記憶體是一段可以被多個進程共享的記憶體段。首先,用shmget系統調用產生指定大小的共享記憶體段,然後需要訪問此共享記憶體的進程調用shmat系統調用,把這個記憶體段附加到自己的地址空間,然後就可以像訪問自己私有的記憶體一樣訪問這個記憶體段了。等到訪問完畢,用shmdt脫離。同message queue一樣,共享記憶體一旦產生,除非明確的刪除(某個有許可權的進程或者用ipcrm命令)或者系統重啟。否則,產生的共享記憶體會一直保留在系統中。而且,只要有許可權,就可以對共享記憶體進行操作。共享記憶體的內容由進程自己定義。為了防止多個進程在同一時間寫同樣一段共享記憶體,一般程式會使用信號量來控制對某一段地址的讀寫。

信號量(semaphore)

在作業系統中,有些資源數量是有限的,在同一時間,只能由有限(一個或幾個)的進程使用和訪問。例如磁帶機,同一時間,只能由一個進程使用。這樣的資源被稱為關鍵(critical)資源。信號量就是用來記錄關鍵資源的使用情況的。首先,利用系統調用semget產生一個信號量。當需要使用關鍵資源時,調用semop,傳遞的參數為需要使用的資源的數量,例如2個,參數就為+2。如果這個資源有2個或者更多可用,進程就獲得了使用權,否則就必須等待,直到有足夠的資源可用。當進程使用資源結束的時候,也用semop釋放關鍵資源。參數為需要釋放的數量,例如2,參數為-2。同message queue一樣,信號量一旦產生,除非明確的刪除(某個有許可權的進程或者用ipcrm命令)或者系統重啟。否則,信號量會一直保留在系統中。而且,只要有許可權,就可以對其進行操作。

相關詞條

熱門詞條

聯絡我們