system v共享記憶體區在概念上類似於posix共享記憶體區。代之以呼叫shm_open後呼叫mmap的是,先呼叫shmget,再呼叫shmat函式。
shmget函式建立乙個尚未存在的共享記憶體區,或者訪問乙個已經存在的共享記憶體區。
#include int shmget(key_t key, size_t size, int oflag);
返回值為共享記憶體區的識別符號。
key既可以是ftok函式的返回值,也可以是ipc_private(大多數實現定義該值為0);
size指定記憶體的大小,且新建的共享記憶體區的所有位元組被初始化為0;若訪問乙個已存在的共享記憶體區,則size值應為0;
oflag位讀寫許可權的組合值。還可以與ipc_creat或ipc_creat | ipc_excl按位或;
void *shmat(int shmid, const void *shmaddr, int flag);
shmid為shmget函式返回的識別符號;
flag引數中也可以指定shm_rdonly值,指定為唯讀。
當乙個程序完成某個共享記憶體區的使用時,它可以呼叫shmdt斷接這個記憶體區.
int shmdt(const void *shmaddr);
shmaddr為程序內共享記憶體區的首位址。
shmctl提供了對乙個共享記憶體區的多種操作:
int shmctl(int shmid, int cmd, struct shmid_ds *buff);
該函式提供以下三個命令:
ipc_rmid 從系統中刪除由shmid標識的共享記憶體區並刪除它;
ipc_set 給所指定的共享記憶體區設定其shmid_ds結構中的以下三個成員:shm_perm.uid,shem_perm.gid和shm_perm.mode,它們的值來自由buff引數指向的結構中的相應成員。
ipc_stat (通常為buff引數)向呼叫者返回所指定共享記憶體區的當前shmid_ds結構。
其中,shmid_ds結構為:
struct shmid_ds
;
// shmget.c
#include #include #include #include #define svshm_mode 0644
int main(int argc, char **argv)
printf("optind = %d\n", optind);
}if(optind != argc - 2)
length = atoi(argv[optind + 1]);
id = shmget(ftok(argv[optind], 0), length, oflag);
ptr = shmat(id, null, 0);
return 0;
}// shmread.c
#include #include #include #define svshm_mode 0644
int main(int argc, char **argv)
id = shmget(ftok(argv[1], 0), 0, svshm_mode);
ptr = shmat(id, null, 0);
shmctl(id, ipc_stat, &buff);
for(i = 0; i < buff.shm_segsz; i++)
if((c = *ptr++) == (i % 256))
return 0;
}// shmrmid.c
#include #include #define svshm_mode 0644
int main(int argc, char **argv)
id = shmget(ftok(argv[1], 0), 0, svshm_mode);
shmctl(id, ipc_rmid, null);
return 0;
}// shmwrite.c
#include #include #define svshm_mode 0644
int main(int argc, char **argv)
id = shmget(ftok(argv[1], 0), 0, svshm_mode);
ptr = shmat(id, null, 0);
shmctl(id, ipc_stat, &buff);
for(i = 0; i < buff.shm_segsz; i++)
*ptr++ = i % 256;
return 0;
}
[test@ localhost] ./shmget info 1234 #指定共享記憶體區大小為1234個位元組
[test@ localhost] ./ipc -m #檢視共享記憶體區資訊
[test@ localhost] ./shmwrite info
[test@ localhost] ./shmread info
System V 共享記憶體區
1 概述 系統呼叫mmap通過對映乙個普通檔案實現共享記憶體。system v 則是通過對映特殊檔案系統shm中的檔案實現程序間的共享記憶體通訊。也就是說,每個共享記憶體區域對應特殊檔案系統shm中的乙個檔案。執行過程是先呼叫shmget,再呼叫shmat。對於每個共享的記憶體區,核心維護如下的資訊...
System V 共享記憶體
一.共享記憶體資料結構 對於每個共享記憶體區,核心維護如下資訊結構,定義在,在ubuntu中路徑 usr include linux shm.h 二.system v共享記憶體函式 include include int shmget key t key,size t size,int shm vo...
共享記憶體System V
system v 共享記憶體區 對於每個共享記憶體區,核心維護如下的資訊結構 obsolete,used only for backwards compatibility and libc5 compiles struct shmid ds struct shmid ds 共享記憶體操作api 0....