//**********====共享記憶體
**********====
共享記憶體:就是開闢一段物理記憶體使多個程序共享
是程序間最高效的傳輸方式
共享記憶體必須結合其他方式來實現程序間的同步
程式設計步驟:
1:開闢一段共享記憶體
int shmget(key_t key, size_t size, int shm***);
key_t key = ftok("..", 'a');
--->stat("..")---->st_ino,st_dev
int shmid;
shmid = shmget(key, 1024, ipc_creat|0666);
shmid = shmget((key_t)12345, 1024, ipc_creat|0666);
2: 將共享記憶體對映到程序的位址空間 //對映的本質就是得到乙個虛擬位址,通過該虛擬位址可以訪問到共享記憶體
void *shmat(int shmid, const void *shmaddr, int shm***);
char *p;
p = shmat(shmid, null, 0); //即可讀又可寫
p = shmat(shmid, null, shm_rdonly); //唯讀
3:對共享記憶體進行讀寫
4:撤銷對映
//取消對映就是使當前程序與共享記憶體切斷關聯
int shmdt(const void *shmaddr);
shmdt(p);
5:刪除共享記憶體
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmctl(shmid, ipc_rmid,null);
//核心用以下結構體來描述乙個
ipc物件的許可權。
struct ipc_perm
spinlock_t lock;
int deleted;
int id;
key_t key;
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t cgid;
mode_t mode;
unsigned long seq;
void *security;
//核心用以下結構體來描述共享記憶體的資訊。
struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms */
int shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
__kernel_time_t shm_dtime; /* last detach time */
__kernel_time_t shm_ctime; /* last change time */
__kernel_ipc_pid_t shm_cpid; /* pid of creator */
__kernel_ipc_pid_t shm_lpid; /* pid of last operator */
unsigned short shm_nattch; /* no. of current attaches */
unsigned short shm_unused; /* compatibility */
void *shm_unused2; /* ditto - used by dipc */
void *shm_unused3; /* unused */
在對共享記憶體寫資料時,會將之前已經有的內容全部覆蓋(理解為陣列).
IPC程序間通訊(共享記憶體)
共享記憶體區是最快的ipc形式。一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。用管道或者訊息佇列傳遞資料,核心為每個ipc物件維護乙個資料結構 用共享記憶體傳遞資料 struct shmid ds inc...
程序間通訊(IPC) 共享記憶體
共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。把物理記憶體按要求申請出來給多個程序使用,共享記憶體訪問起來比較快,用起來比較簡單,不需要一些特別的函式。共享記憶體實現...
程序間通訊IPC之 共享記憶體
每個程序各自有不同的使用者位址空間,任何乙個進 程的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝 區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interprocess commun...