程序間通訊 訊號量

2021-06-21 10:59:44 字數 3628 閱讀 8145

system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket_t

在終端輸入命令 ipcs ,可以看到目前系統中所有的ipc資訊

------------ 共享記憶體段 --------------

鍵 shmid 擁有者 許可權 位元組 nattch 狀態

0x00000000 1507328 tian 600 2097152 2 目標

0x00000000 884737 tian 600 1048576 2 目標

0x00000000 11141122 tian 600 2097152 2 目標

0x00000000 524291 tian 600 393216 2 目標

0x00000000 10846212 tian 600 524288 2 目標

0x00000000 720901 tian 600 524288 2 目標

0x00000000 1540102 tian 600 393216 2 目標

0x00000000 9830407 tian 600 393216 2 目標

0x00000000 1245192 tian 600 2097152 2 目標

0x00000000 1572873 tian 600 1048576 2 目標

0x00000000 3145738 tian 600 524288 2 目標

0x00000000 9994251 tian 600 12288 2 目標

0x00000000 10944524 tian 600 2097152 2 目標

0x00000000 11239437 tian 600 33554432 2 目標

--------- 訊號量陣列 -----------

鍵 semid 擁有者 許可權 nsems

--------- 訊息佇列 -----------

鍵 msqid 擁有者 許可權 已用位元組數 訊息

ftok()函式用於獲得乙個ipc關鍵字,其函式原型為

#include #include key_t ftok(const char *pathname, int proj_id);
pathname 必須是乙個已經存在並具有訪問許可權 的檔案,pro_jd 只有低8位有效,常用ascii字元代替。當兩個都相同時,ftok返回相同的鍵值。

ipc關鍵字可以由 ftok()函式獲得,也可以設為ipc_private ,這時系統會確保建立乙個新的ipc,其識別符號需要由程序自己記錄並告訴其他程序。

訊號量函式由semget、semop、semctl三個函式組成。

semget(得到乙個訊號量集識別符號或建立乙個訊號量集物件)

#include #include #include int semget(key_t key, int nsems, int sem***)
nsems 建立訊號量集中訊號量的個數,該引數只在建立訊號量集時有效

msg*** ipc_creat:當sem***&ipc_creat為真時,如果核心中不存在鍵值與key相等的訊號量集,則新建乙個訊號量集;如果存在這樣的訊號量集,返回此訊號量集的識別符號

ipc_creat|ipc_excl:如果核心中不存在鍵值與key相等的訊號量集,則新建乙個訊息佇列;如果存在這樣的訊號量集則報錯

semop(完成對訊號量的p操作或v操作)

#include #include #include int semop(int semid, struct sembuf *sops, unsigned nsops)

struct sembuf ;

struct sembuf sem_get=; /*將訊號量物件中序號為0的訊號量減1*/

struct sembuf sem_get=;  /*將訊號量物件中序號為0的訊號量加1*/

struct sembuf sem_get=;           /*程序被阻塞,直到對應的訊號量值為0*/

flag一般為0,若flag包含ipc_nowait,則該操作為非阻塞操作。若flag包含sem_undo,則當程序退出的時候會還原該程序的訊號量操作,這個標誌在某些情況下是很有用的,比如某程序做了p操作得到資源,但還沒來得及做v操作時就異常退出了,此時,其他程序就只能都阻塞在p操作上,於是造成了死鎖。若採取sem_undo標誌,就可以避免因為程序異常退出而造成的死鎖。

#include #include #include int semctl(int semid, int semnum, int cmd, union semun arg)
常用的cmd有,setval,用聯合體中val成員的值設定訊號量集合中單個訊號量的值

例子:

#include #include #include #include #include #include #include #include #include #include #include #include #if 0

union semun

;#endif

/*define a function pid_printf*/

void pid_printf(char *format, ...)

/*release sem*/

void sem_release(int id)

pid_printf("releassed ok.\n");

}/*request sem*/

void sem_request(int id)

printf("request ok!\n");

}/*delete sem*/

void sem_delete(int id)

}int main(int argc, char *argv)}}

else

if(id == -1)

pid_printf("sucessfully! id=[%d]\n", id);

while(1)

}return 0;

}

程序間通訊 訊號量

ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...

程序間通訊 訊號量

訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...

程序間通訊 訊號量

訊號量與已經介紹過的ipc機構 管道 fifo以及訊息列隊 不同。它是乙個計數器,用於多程序對共享資料物件的訪問。為了獲得共享資源,程序需要執行下列操作 1 測試控制該資源的訊號量。2 若此訊號量的值為正,則程序可以使用該資源。程序將訊號量值減1,表示它使用了乙個資源單位。3 若此訊號量的值為0,則...