SystemV Posix 共享記憶體

2021-09-01 16:12:18 字數 4813 閱讀 2954

systemv:

用到的函式:

ftok : 生成乙個32位整數, shmget第乙個引數需要用到. 相同的key,返回相同的shmid

shmget : 用於建立或獲取乙個共享記憶體。返回乙個id用於標識這塊ipc物件;

shmat: 把共享記憶體對映到程序位址空間.

shmdt : 斷開對映.與shmat,作用相反;

shmctl : 獲取共享記憶體屬性(大小,許可權,建立時間,pid....). 刪除共享記憶體

posix: 基於檔案

共享記憶體訊號量結合使用 mmap : 共享記憶體訊號量

shm_open:  建立或開啟乙個 /dev/shm 的共享記憶體 

shm_unlink : 刪除 /dev/shm 共享記憶體

mmap : 把共享記憶體(檔案) 對映到程序內 . 用於讀寫, 相對於 shmat 的用作

ftruncate : 更改記憶體大小

例子:system v:

shmget.c :

建立乙個共享記憶體

#include #include #include #include #include #include int main(int argc, char ** argv)

char *pathname = argv[1];

int len = atoi(argv[2]);

printf("pathname:%s, len:%d\n",pathname,len);

//ftok -> 生成乙個key , 用於標示乙個ipc物件.

int key = ftok(pathname , 0);

printf("key : %d\n" , key);

//建立或者獲取乙個共享記憶體. 返回乙個共享記憶體的標示.

//相同的key , 返回相同的shmid

int shmid = shmget(key,len,ipc_creat|0644);

printf("shmid:%d\n",shmid);

//對映到當前的程序位址空間中.之後進行讀寫

char*p = (char*)shmat(shmid,null,0);

printf("p:%p\n",p);

struct shmid_ds shmbuf;

//shmctl 可獲取shm的狀態,也可以刪除共享記憶體

shmctl(shmid,ipc_stat,&shmbuf);

printf("size:%ld,creator pid:%d,links:%ld\n",

shmbuf.shm_segsz,shmbuf.shm_cpid,shmbuf.shm_nattch);

//取消對映,相當於斷開鏈結.注意,刪除需要用shmctl

shmdt(p);

return 0;

}

shmrmid.c :

用於刪除乙個共享記憶體

#include #include #include #include #include #include int main(int argc, char ** argv)

int key = ftok(argv[1],0);

printf("key:%d\n" , key);

int shmid = shmget(key,0,0644);

printf("shmid:%d\n" , shmid);

shmctl(shmid,ipc_rmid,null);

return 0;

}

shmwrite.c : 寫入共享記憶體

#include #include #include #include #include int main(int argc, char ** argv)

int key = ftok(argv[1],0);

int shmid = shmget(key,0,0664);

printf("key:%d, shmid:%d\n",key,shmid);

char *ptr= (char*)shmat(shmid,null,0);

char *p = ptr;

printf("ptr:%p\n", ptr);

struct shmid_ds shmbuf;

shmctl(shmid,ipc_stat,&shmbuf);

printf("shm size:%ld\n",shmbuf.shm_segsz);

for(int i =0 ; i < shmbuf.shm_segsz;++i)

*p++ = i;

shmdt(ptr);

return 0;

}

shmread.c : 讀取共享記憶體

#include #include #include #include #include int main(int argc, char ** argv)

int key = ftok(argv[1],0);

int shmid = shmget(key,0,0664);

char *ptr = (char*)shmat(shmid,null,0);

char *p = ptr;

struct shmid_ds shmbuf;

shmctl(shmid,ipc_stat,&shmbuf);

printf("shm size :%ld\n",shmbuf.shm_segsz);

for(int i = 0 ; i < shmbuf.shm_segsz;++i)

printf("%c ",*p++);

puts("");

shmdt(ptr);

return 0;

}

posix :

shm_open.c

#include #include #include #include #include #include #include #include #include int main(int argc , char ** argv , char ** env)

int flags = o_rdwr|o_creat;

int size = atoi(argv[2]);

int shmfd = shm_open(argv[1],flags,0664);

printf("shmfd :%d\n",shmfd);

ftruncate(shmfd,size);

struct stat stat;

fstat(shmfd,&stat);

printf("shm size:%ld\n" , stat.st_size);

char * ptr = (char*)mmap(null,size,prot_write|prot_read,map_shared,

shmfd,0);

printf("mmap :%p\n" , ptr);

return 0;

}

shm_unlink.c

#include #include #include #include #include #include #include #include int main(int argc , char ** argv , char ** env)

shm_unlink(argv[1]);

return 0;

}

shm_write.c

#include #include #include #include #include #include #include #include #include int main(int argc , char ** argv , char ** env)

int shmfd = shm_open(argv[1],o_rdwr,0664);

printf("shmid : %d\n" , shmfd);

struct stat stat;

fstat(shmfd,&stat);

printf("shm size : %ld\n" , stat.st_size);

char * ptr = mmap(null,stat.st_size,prot_read|prot_write,map_shared,

shmfd,0);

close(shmfd);

char * p = ptr;

for(int i = 0; i < stat.st_size; ++i)

*p++ = i;

return 0;

}

shm_read.c

#include #include #include #include #include #include #include #include #include int main(int argc , char ** argv , char ** env)

int shmfd = shm_open(argv[1],o_rdwr,0664);

struct stat stat;

fstat(shmfd,&stat);

char * ptr = (char*)mmap(null,stat.st_size,prot_read,map_shared,shmfd,0);

char * p = ptr;

for(int i =0 ; i < stat.st_size;++i)

printf("%c " ,*p++);

puts("");

close(shmfd);

return 0;

}

CreateFileMapping 共享記憶體

handle hfile,dword flprotect,dword dwmaximumsizehigh,dword dwmaximumsizelow,lpctstr lpname hfile 共享檔案控制代碼,不建立共享檔案,為invalid handle value flprotect 保護選項...

執行緒範圍內共享資料

我們可以先用所學知識來寫乙個 public class threadscopesharedata start static class a static class b 如果光像上面這樣寫的話,那毫無疑問,肯定是有問題的,如下圖所示並沒有實現執行緒共享 此時就實現執行緒內共享資料了 public c...

RHCE 建立系統內共享目錄

建立乙個共享目錄 home admins 特性如下 home admins目錄的組所有權是adminuseradminuser組的成員對目錄有讀寫和執行的許可權。除此之外的其他所有使用者沒有任何許可權 root使用者能夠訪問系統中的所有檔案和目錄 在 home admins目錄中建立的檔案,其組所有...