System V 共享記憶體區

2021-07-05 00:19:51 字數 2581 閱讀 5671

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....