system V 共享內存

頭文件:

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;
	}
}



發佈了93 篇原創文章 · 獲贊 44 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章