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目錄中建立的檔案,其組所有...