1. 程式人生 > >UNIX C XSI_IPC對象、共享內存

UNIX C XSI_IPC對象、共享內存

include rdo -- ipc 內存 gid 命令 mdt 用戶id

1.創建IPC對象

  

#include <sys/ipc.h>

key_t ftok(const char* pathname,int proj_id);

成功返回可用於創建或獲取IPC的鍵,失敗則返回-1

2.創建、獲取共享內存

#include <sys/shm.h>

int shmget(key_t key,size_t size,int shmflg);

成功返回共享內存標誌符,失敗返回-1

--key:共享內存鍵
--size:共享內存大小
--shmflg:創建標誌,可取以下值
    0  -獲取,不存在即失敗
    IPC_CREAT 
-創建,不存在即創建,已存在即獲取 IPC_EXCL -排斥,已存在即失敗

 

3.加載共享內存

#include <sys/shm.h>

void* shmat(int shmid,const void* shmaddr,int shmflg);

成功返回共享內存起始地址,失敗返回-1

--shmid:共享內存標誌符

--shmaddr:指定映射地址,可置NULL,由系統自動選擇

--shmflg:加載標誌
    
    0 -以讀寫方式使用共享內存
    SHM_RDONLY - 以只讀方式使用共享內存
    SHM_RND  - 只在shmaddr參數非NULL時起作用

4.卸載共享內存

#include <sys/shm.h>

int shmdt(const void* shmaddr);

成功返回0,失敗返回-1

--shmaddr:共享內存起始地址

5.銷毀/控制共享內存

#include <sys/shm.h>

int shmctl(int shmid,int cmd,struct shmid_ds* buf);

成功返回0,失敗返回-1

--shmid:共享內存標誌符
--cmd:控制命令,可取以下值
    IPC_STAT -獲取共享內存的屬性,通過buf參數輸出
    IPC_SET -設置共享內存的屬性,通過buf參數輸入,僅以下三個屬性可以設置
    
    shmid_ds::shm_perm.uid
//擁有者用戶ID shmid_ds::shm_perm.gid//擁有者組ID shmid_ds::shm_perm.mode//權限 IPC_RMID -銷毀共享內存。不是真的銷毀,只是做個銷毀標記,禁止任何進程對該共享內存形成新的加載 -buf:shmid_ds類型的共享內存屬性結構

6.消息隊列

  創建/獲取消息隊列

#include <sys/msg.h>

int msgget(key_t key,int msgflg);

成功返回消息隊列標誌符,失敗返回-1

-key:消息隊列鍵
-msgflg:創建標誌,可取以下值
0    -獲取,不存在即失敗
IPC_CREAT :創建,不存在即失敗
IPC_EXCL -排斥,已存在即失敗

  發送消息

#include <sys/msg.h>

int msgsnd (int msqid,const void* msgp,size_t msgsz,int msgflg);
    
成功返回0,失敗返回-1

-msqid:消息隊列標誌符
-msgp:指向一個包含消息類型和消息數據的內存塊。
-msgsz:期望發送消息數據的字節數
-msgflg :發送標誌,一般取0即可

  接收消息

#include <sys/msg.h>

ssize_t msgrcv (int msqid,void* msgp,size_t msgsz,long msgtyp,int msgflg);

成功返回所接收消息數據的字節數,失敗返回-1

--msqid:消息隊列標誌符
--msgp:指向一塊包含消息類型(4字節)和消息數據的內存
--msgsz :期望接收消息數據的字節數

  銷毀或控制消息隊列

#include <sys/msg.h>

int msgctl(int msqid,int cmd,struct msqid_ds* buf);
成功返回0,失敗返回-1

-msqid:消息隊列標誌符

--cmd:控制命令,可取以下值
 IPC_STAT -獲取共享內存的屬性,通過buf參數輸出
    IPC_SET -設置共享內存的屬性,通過buf參數輸入,僅以下三個屬性可以設置
    
    shmid_ds::shm_perm.uid//擁有者用戶ID
    shmid_ds::shm_perm.gid//擁有者組ID
    shmid_ds::shm_perm.mode//權限
    IPC_RMID -銷毀共享內存。不是真的銷毀,只是做個銷毀標記,禁止任何進程對該共享內存形成新的加載
-buf:shmid_ds類型的共享內存屬性結構


  

7.信號量

  創建\獲取信號量集

#include <sys.sem.h>

int semget (key_t key,int nsems,int semflg);

成功返回信號量集標誌符,失敗返回-1

-key :信號量集鍵
-nsems:信號量個數
-semflg:創建標誌,可取以下值
    0 -獲取,不存在即創建,已存在即獲取
    IPC_CREAT -創建,不存在即創建,已存在即獲取
    IPC_EXCL -排斥,已存在即失敗

  

  操作信號量集

#include <sys.sem.h>

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

成功返回0,失敗返回-1

-semid:信號量集標誌符
-sops:操作結構體數組
-nsops:操作結構體數組的長度

struct sembuf{
    unsigned short sem_num;//信號量編號
    short     sem_op;//操作數
    short     sem_flg;//操作標誌
};

  銷毀\控制信號量集

#include <sys/sem.h>

int semctl(int semid,int semnum,int cmd,....);

成功返回0(cmd取某些值時存在例外),失敗返回-1

-semid:信號量集標誌符
-semnum:信號量編號
-cmd:控制命令

UNIX C XSI_IPC對象、共享內存