【校招 --阶段一 系统编程】system V共享内存
一、什么是system V共享內存
共享內存區是最快的IPC形式。一旦這樣的內存映射到共享它的進程的地址空間,這些進程間數據傳遞不再涉及到
內核,換句話說是進程不再通過執行進入內核的系統調用來傳遞彼此的數據
當兩個進程在物理內存中開辟同一塊i空間,并且映射到兩個進程的地址空間的共享內存中,兩個進程就能建立通信
當一個進程往里面寫入數據,那一個進程直接就能看到。中間沒有緩沖區的作用。
創建共享內存時操作系統提供的
共享內存函數
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok( const char * pathname , int proj_id );
參數:
pathname 就時你指定的文件名(該文件必須是存在而且可以訪問的),id是子序號,雖 然為int,但是只有8個比特被使用(0-255)。
返回值: 成功時候返回key_t 類型的key值,失敗返回-1
函數ftok把一個已存在的路徑名和一個整數標識得轉換成一個key_t值
IPC(共享內存)資源隨內核,如果不釋放,就一直存在。
功能:用來創建共享內存
原型
int shmget(key_t key, size_t size, int shmflg);
參數
key:這個共享內存段名字
size:共享內存大小
shmflg:由九個權限標志構成,它們的用法和創建文件時使用的mode模式標志是一樣的
返回值:成功返回一個非負整數,即該共享內存段的標識碼(使用戶層面的,而key值時操作系統層面依賴標識共享內存的);失敗返回-1
shmflg主要和一些標志有關。其中有效的包括IPC_CREAT和IPC_EXCL,它們的功能與open()的O_CREAT和O_EXCL相當。
IPC_CREAT 如果共享內存不存在,則創建一個共享內存,否則打開操作。
IPC_EXCL 只有在共享內存不存在的時候,新的共享內存才建立,否則就產生錯誤。
如果單獨使用IPC_CREAT ,shmget()函數要么返回一個已經存在的共享內存的操作符 ,要么返回一個新建的共享內存的標識符 。
如果將 IPC_CREAT和IPC_EXCL標志一起使用,shmget()將返回一個新建的共享內存的標識符;如果該共享內存已存在,或者返回-1
功能:用于控制共享內存
原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
參數
shmid:由shmget返回的共享內存標識碼
cmd:將要采取的動作(有三個可取值)
buf:指向一個保存著共享內存的模式狀態和訪問權限的數據結構,一般為NULL
返回值:成功返回0;失敗返回-1
功能:將共享內存段連接到進程地址空間
原型
void *shmat(int shmid, const void *shmaddr, int shmflg);
參數
shmid: 共享內存標識
shmaddr:指定連接的地址
shmflg:它的兩個可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一個指針,指向共享內存第一個節;失敗返回-1
說明:
shmaddr為NULL,核心自動選擇一個地址
shmaddr不為NULL且shmflg無SHM_RND標記,則以shmaddr為連接地址。
shmaddr不為NULL且shmflg設置了SHM_RND標記,則連接的地址會自動向下調整為SHMLBA的整數倍。公式:shmaddr -
(shmaddr % SHMLBA)
shmflg=SHM_RDONLY,表示連接操作用來只讀共享內存
共享內存底層不提供任何同步互斥的機制
#include<iostream> #include <sys/types.h> #include <sys/ipc.h> #include<unistd.h> #include<stdlib.h> #include<sys/shm.h> using namespace std; int main(){ key_t k=ftok("./",0x666666); cout<<"k"<<k<<endl; int shat=shmget(k,4096,IPC_CREAT|IPC_EXCL|0666);//創建共享內存 if(shat<0){cout<<"share 創建失敗!"<<endl; return 1; }//jianl //建立宿舍關系 char *str=(char*)shmat(shat,NULL,0); while(1){ sleep(1); cout<<str<<endl; } shmdt(str); shmat(shat,IPC_RMID,NULL);//刪除共享內存 return 0; } #include<iostream> #include <sys/types.h> #include <sys/ipc.h> #include<unistd.h> #include<stdlib.h> #include<sys/shm.h> using namespace std; int main(){ key_t k=ftok("./",0x666666); cout<<"k"<<k<<endl; int shat=shmget(k,4096,IPC_CREAT|IPC_EXCL|0666);//創建共享內存 if(shat<0){cout<<"share 創建失敗!"<<endl; return 1; } //jianl //建立宿舍關系 char *str=(char*)shmat(shat,NULL,0); while(1){ sleep(1); cout<<str<<endl; } shmdt(str); shmat(shat,IPC_RMID,NULL);//刪除共享內存 return 0; } ipcrm -m 688145 #刪除shm ipc資源,注意,不是必須通過手動來刪除,這里只為演示相關指令,刪除IPC資源是進 程該做的事情共享內存沒有進行同步與互斥!
總結
以上是生活随笔為你收集整理的【校招 --阶段一 系统编程】system V共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Firefox 扩展“此组件无法安装,因
- 下一篇: 2012服务器系统配置DNS,win服务