當前位置:編程學習大全網 - 編程語言 - 進程間通信的操作

進程間通信的操作

管道分為有名管道和無名管道,無名管道只能用於親屬進程之間的通信,而有名管道則可用於無親屬關系的進程之間。

在Linux系統下,命名管道可由兩種方式創建(假設創建壹個名為“fifoexample”的有名管道):

(1)mkfifo(fifoexample,rw);

(2)mknod fifoexample p

mkfifo是壹個函數,mknod是壹個系統調用,即我們可以在shell下輸出上述命令。

有名管道創建後,我們可以像讀寫文件壹樣讀寫它。

消息隊列用於運行於同壹臺機器上的進程間通信,與管道相似。 通常由壹個進程創建,其余進程對這塊內存區進行讀寫。得到***享內存有兩種方式:映射/dev/mem設備和內存映像文件。前壹種方式不給系統帶來額外的開銷,但在現實中並不常用,因為它控制存取的是實際的物理內存;常用的方式是通過shmXXX函數族來實現***享內存:

int shmget(key_t key, int size, int flag); /* 獲得壹個***享存儲標識符*/

該函數使得系統分配size大小的內存用作***享內存;

void *shmat(int shmid, void *addr, int flag); /* 將***享內存連接到自身地址空間中*/

如果壹個進程通過fork創建了子進程,則子進程繼承父進程的***享內存,既而可以直接對***享內存使用,不過子進程可以自身脫離***享內存。

shmid為shmget函數返回的***享存儲標識符,addr和flag參數決定了以什麽方式來確定連接的地址,函數的返回值即是該進程數據段所連接的實際地址。此後,進程可以對此地址進行讀寫操作訪問***享內存。

對於***享內存,linux本身無法對其做同步,需要程序自己來對***享的內存做出同步計算,而這種同步很多時候就是用信號量實現。 本質上,信號量是壹個計數器,它用來記錄對某個資源(如***享內存)的存取狀況。信號量,分為互斥信號量,和條件信號量。壹般說來,為了獲得***享資源,進程需要執行下列操作:

(1)測試控制該資源的信號量;

(2)若此信號量的值為正,則允許進行使用該資源,進程將信號量減去所需的資源數;

(3)若此信號量為0,則該資源目前不可用,進程進入睡眠狀態,直至信號量值大於0,進程被喚醒,轉入步驟(1);

(4)當進程不再使用壹個信號量控制的資源時,信號量值加其所占的資源數,如果此時有進程正在睡眠等待此信號量,則喚醒此進程。 套接字通信並不為Linux所專有,在所有提供了TCP/IP協議棧的操作系統中幾乎都提供了socket,而所有這樣操作系統,對套接字的編程方法幾乎是完全壹樣的。

  • 上一篇:做壹個商城app需要多少錢
  • 下一篇:太空步的舞步分解
  • copyright 2024編程學習大全網