Linux IPC 共享記憶體

2022-09-06 03:48:10 字數 2208 閱讀 5795

posix.1提供了兩種在無親緣關係的程序間共享記憶體的方式

(1)記憶體對映檔案:由open函式開啟

乙個檔案

,由mmap函式把得到的描述符對映到當前程序位址空間中。

(2)共享記憶體區物件:由shm_open開啟乙個posix.1 ipc名字(通常是檔案系統中的乙個路徑名),所返回的描述符由mmap函式對映到當前程序位址空間。

posix的訊息佇列和訊號量都是一次呼叫直接返回,mq_open返回mqd_t值,sem_open返回sem_t值的指標,而posix的共享記憶體卻需要先shm_open(或者open)然後再mmap,這是因為posix在發明自己的共享記憶體形式時,已經存在mmap...

/*

shm_open, shm_unlink - create/open or unlink posix shared memory objects

*/#include

#include

/*for mode constants

*/#include

/*for o_* constants

*/int shm_open(const

char *name, int

oflag, mode_t mode);

int shm_unlink(const

char *name);

/*mmap, munmap - map or unmap files or devices into memory

*/#include

void *mmap(void *addr, size_t length, int prot, int

flags,

intfd, off_t offset);

int munmap(void *addr, size_t length);

/*truncate, ftruncate - truncate a file to a specified length

*/#include

#include

int truncate(const

char *path, off_t length);

int ftruncate(int

fd, off_t length);

link with -lrt.

注:可以呼叫ftruncate來修改共享記憶體區的大小

/*

shmget - allocates a system v shared memory segment

*/#include

#include

int shmget(key_t key, size_t size, int

shm***);

/*shmat, shmdt - system v shared memory operations

*/#include

#include

void *shmat(int shmid, const

void *shmaddr, int

shm***);

int shmdt(const

void *shmaddr);

/*shmctl - system v shared memory control

*/#include

#include

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

struct

shmid_ds ;

struct

ipc_perm ;

注:shmctl的cmd可以取值如下:

ipc_rmid: 刪除指定共享記憶體區

ipc_set:  支援設定指定共享記憶體區的 shmid_ds結構體中的 shm_prem.uid, shm_prem.gid 和 shm_prem.mode

ipc_stat: 返回指定共享記憶體區的shmid_ds 結構

system v 共享記憶體區的限制

posix 共享記憶體和system v共享記憶體的區別

posix共享記憶體區物件的大小可在任何時刻通過呼叫ftruncate修改,而system v共享記憶體的大小是在呼叫shmget建立時固定下來的。

linux ipc機制 共享記憶體

17.shmat 功能 聯接共享記憶體的操作.語法 include include include void shmat shmid,shmaddr,shm int shmid void shmaddr int shmid 說明 將由shmid指示的共享記憶體聯接到呼叫程序的資料段中.被聯接的段放在...

Linux IPC之共享記憶體

程序都有自己的虛擬位址空間 每個程序的虛擬位址空間都不一樣 自己只能操作自己的位址空間 虛擬位址空間 這時如何實現程序間的資料交換,這裡核心給我們提供了介面,讓多個程序共同操作同塊特殊的記憶體區域,這就實現了資料交換 共享記憶體區域是被多個程序共享的一部分物理記憶體。如果多個程序都把該記憶體區域對映...

Linux共享記憶體及共享記憶體API

共享記憶體區是最快的ipc 程序間通訊 形式。用共享記憶體從伺服器拷貝檔案資料到客戶端 共享記憶體基本api include include 1.int shmget key t key,size t size,int shm 功能 用來建立共享記憶體 key 是這個共享記憶體段的名字 size 共...