頭文件:
sys/shm.h
查看:
ipcs
共享內存獲取:
int shmget(key_t key,size_t size,int shmflg);
key:
IPC_PRIVATE——親緣間
ftok———————非親緣間
size:
內存容量:
非0——新建的共享內存大小
0———獲取共享內存
shmflg:
IPC_CREAT
IPC_CREAT|IPC_EXEC
IPC_CREAT|0644
O_flag
返回值:
-1—————失敗
非負整數——共享內存標識符
共享內存連接:
void* shmat(int shmid,const void* shmaddr,int shmflg);
shmid:
共享內存標識符。
shmaddr:
指定共享內存連接到當前進程中的地址位置。
爲兼容性考慮,通常爲NULL,表示讓系統來選擇共享內存的地址。
shmflg:
標誌位。
SHM_RDONLY——只讀
0————————只寫
返回值:
非負整數——共享內存指針
-1—————失敗
共享內存分離:
int shmdt(const void* shmaddr);
shmaddr:
共享內存指針。
返回值:
0——成功
-1——失敗
共享內存控制:
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
shmid:
共享內存標識符。
cmd:
IPC_STAT——獲取當前共享內存控制信息
IPC_SET——設置當前共享內存控制信息
IPC_RMID——刪除共享內存
buf:
共享內存信息結構
int shm_segsz——共享內存大小
shm_perm.mode——讀寫權限
返回值:
0——成功
-1——失敗
實例:
獲取共享內存大小:
shmctl(shmid,IPC_STAT,&buf);
buf.shm_segsz
刪除共享內容:
shmctl(shmid,IPC_RMID,NULL);
代碼:
創建:
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
int main(int argc,char* argv[]){
key_t key = ftok(argv[1],1);
if(-1 == key){
perror("ftok err");
return 1;
}
int shmid = shmget(key,atoi(argv[2]),IPC_CREAT|0644);
if(-1 == shmid){
perror("shmget err");
return 1;
}
printf("shmid:%d\n",shmid);
return 0;
}
讀:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
int main(int argc,char* argv[]){
key_t key = ftok(argv[1],1);
if(-1 == key){
perror("ftok err");
return 1;
}
int shmid = shmget(key,0,O_RDONLY);
if(-1 == shmid){
perror("shmget err");
return 1;
}
void* buf = shmat(shmid,NULL,SHM_RDONLY);
printf("%s\n",buf);
shmdt(NULL);
printf("shmid:%d\n",shmid);
return 0;
}
寫:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
int main(int argc,char* argv[]){
key_t key = ftok(argv[1],1);
if(-1 == key){
perror("ftok err");
return 1;
}
int shmid = shmget(key,0,O_RDWR);
if(-1 == shmid){
perror("shmget err");
return 1;
}
void* buf = shmat(shmid,NULL,0);
if((void*)-1 == buf){
perror("shmat err");
return 1;
}
strcpy(buf,"hello shmat\n");
shmdt(0);
return 0;
}
刪除:
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
int main(int argc,char* argv[]){
if(-1 == shmctl(atoi(argv[1]),IPC_RMID,NULL)){
perror("shmctl err");
return 1;
}
}