用共享記憶體實現程序間通訊,可以省卻檔案向程序的讀取、修改、寫回一系列繁瑣的操作。而是直接可對該記憶體空間進行修改。
相關函式
posix和system v均提供了共享記憶體的實現函式,linux將兩種實現方式均吸納為己所用。
posix的函式:shm_open mmap munmap ftruncate
systemv的函式:shmget shmat shmdt shmctl
posix共享記憶體步驟:
1 . 建立或開啟共享記憶體區
int shm_open(const char *name, int o_flag, mode_t mode);
name指定建立或開啟的共享記憶體的名稱;
o_flag為開啟方式;
mode在flag為o_creat才有效。
2. 設定共享記憶體的大小
int ftruncate(int fd, off_t length);
fd為共享記憶體的描述符;
length指定調整的大小
3. 對映共享記憶體區
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
addr指向對映儲存區的起始位址,通常設為null讓系統自動分配;
length為對映的位元組數;
prot為對對映儲存區的許可權,該許可權不能超過檔案的open模式訪問許可權;
flags指定對映是否為共享的,即一旦修改其它程序是否能看到變化;
offset為要對映位元組在檔案中的起始偏移量。
取消對映共享記憶體
int munmap(void *addr, size_t length);
addr為mmap()返回的位址;
length為對映的位元組數。
刪除共享記憶體
int shm_unlink(const char *name);
systemv共享記憶體步驟:
1 . 建立或開啟共享記憶體區
int shmget(key_t key,size_t size, int shm***);
引數key:通過唯一的key值,使本函式返回乙個與key相關的共享記憶體識別符號(非負);
引數size:位元組為單位的容量大小
引數shm***:shm***為許可權標誌,指示該記憶體的使用許可權,如0644代表建立者可讀寫、其他使用者只能讀取。如果該共享記憶體區不存在,需要建立的話,可以加上ipc_creat,如0644|ipc_creat
2. 連線共享記憶體區(attach)
建立完共享記憶體後,需要連線到當前程序的位址空間才能對齊訪問。
void *shmat(int shmid, const void *shm_addr, int shm***);
引數shmid:共享記憶體識別符號(通過shmget()獲得)
引數shm_addr:指定要連線到當前程序的位址位置,一般用null自動分配。
引數shm***:標誌位,一般為0.
呼叫成功返回共享記憶體的第乙個位元組的指標,失敗返回-1.
3 . 解除共享記憶體連線(detach)
int shmdt(const void *shmaddr);
4 . 控制共享記憶體
int shmctl(int shmid, int command, struct shmid_ds *buf);
引數shmid:共享記憶體識別符號
引數command:要採取的操作
引數buf:是乙個結構指標,指向共享記憶體模式和訪問許可權的結構。
linux基礎知識點
1.在vmware安裝linux系統和快照功能使用。注意 2.系統目錄介紹 1 表示根目錄 2 表示 root 3 etc 存放系統配置目錄 4 home 除了root以為所有使用者預設在home下新建乙個以使用者名為資料夾名稱的資料夾。5 usr 所有使用者安裝的軟體都放入這個資料夾中。知識點擴充...
linux基礎知識點複習
暫時先放一些linux的一些操作的東西 1 vm 虛擬機器 2 redhad 作業系統 3 xshell 終端軟體 4 notepad 編碼 5 課件 思維導圖 mindmanage word ppt xshell nat模式連線 ssh ip位址 注意 1 必須要有網 2 虛擬機器的網絡卡要開啟 ...
linux基礎知識點一
命令的語法 命令 選項 引數 引數 命令操作的物件 選項 命令在操作物件是採用不容的選項即使用不同的方式。基本命令 ls 列出目錄中的內容 list 選項 l 以長格式的方式列出 ll ls l a 列出全部內容,包含隱藏檔案和隱藏目錄 h 以人類易讀的方式顯示 pwd 列印當前工作目錄 cd 更改...