用戶空間 進程A <----沒法通訊----> 進程B -----------------|--------------------------------------|-------------- | | 內核空間 |<-------------> IPC <--------------->| ---------------------------------------------------------------------- IPC分3種: 消息隊列 共享內存 信號燈 open msgget shmget semget read/write msgsen msgrecv shmat shmdt semop close msgctrl shmctrl semctrl
#include <sys/shm.h> #include <sys/ipc.h> #include <sys/types.h> int shmget(key_t key, size_t size, int shmflg); //建立共享內存 key_t ftok(const char *path, int id); //建立key值 void *shmat(int shmid, const void *shmaddr, int shmflg); //將共享內存的地址映射到用戶空間 int shmdt(const void *shmaddr);
int shmget(key_t key, size_t size, int shmflg); //key IPC_PRIVATE 或者ftok的返回值 //size_t size 共享內存的大小#include <sys/ipc.h> system("ipcs -m"); //查看共享內存 sprintf(cmd,"ipcrm -m %d",shmid); system(cmd); //刪除共享內存 key_t ftok(const char *path, int id); //建立key值 //path文件路徑,id 一個字符 //成功-> key 失敗-> -1;
void *shmat(int shmid, const void *shmaddr, int shmflg); //將共享內存的地址映射到用戶空間 //int shmid :ID號 //const void *shmaddr 映射到的地址,NULL爲系統自動分配 //shmflg SHM_RDONLY 只讀,默認是0 可讀可寫 //返回值 映射後的地址。 失敗NULL
#include <sys/sem.h> int semget(key_t key, int nsems, int semflg); //建立sem信號燈 int semctl(int semid, int semnum, int cmd, ...); //關閉sem信號燈 #include <semaphore.h> int sem_wait(sem_t *sem); int sem_post(sem_t *sem);
例子 1.shmgetpost
#include <stdio.h> #include <string.h> #include <sys/shm.h> #include <sys/ipc.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char const *argv[]) { int shmid; char cmd[128]; shmid = shmget(IPC_PRIVATE,128,0755); if(shmid < 0){ perror("shmget"); } printf("shmid = %d\n",shmid); system("ipcs -m"); //查看 sprintf(cmd,"ipcrm -m %d",shmid); system(cmd); return 0; }
2.spa