日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IPC--三---共享内存

發布時間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IPC--三---共享内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、何謂共享內存?

共享內存可以說是最有用的進程間通信方式,也是最快的IPC形式。兩個不同進程A、B共享內存的意思是,同一塊物理內存被映射到進程A、B各自的進程地址空間。進程A可以即時看到進程B對共享內存中數據的更新,反之亦然。由于多個進程共享同一塊內存區域,必然需要某種同步機制,互斥鎖和信號量都可以。

二:共享內存的使用

1. 創建共享內存(打開)

#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key,size_t size,int shmflg>;key(非0整數):為共享內存段命名,shmget成功時返回一個與key相關的內存標識符shm_id(非負整數),失敗時返回-1size:以字節為單位指定需要共享的內存容量shmflg:權限標志,與open函數的mode參數一樣,創建共享內存時此參數位可寫成 IPC_CREAT | 0666
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.啟動進程對共享內存的訪問(映射)?
第一次創建完共享內存時,它還不能被任何進程訪問,shmat函數的作用就是用來啟動對該共享內存的訪問,并把共享內存連接到當前進程的地址空間。

#include<sys/types.h> #include <sys/shm.h> void *shmat(int shm_id, const void *shm_addr, int shmflg);shm_id: 是由shmget 函數返回的共享內存標識。shm_addr:指定共享內存連接到當前進程的地址位置,通常為空,表示讓系統來選擇共享內存的地址。shm_flg:是一組標志位,通常為0。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

shmat 調用成功后返回一個指向共享內存第一個字節的指針,調用失敗返回-1。

3、分離共享內存(解除映射)?
shmdt函數用于將共享內存從當前進程中分離。注意,將共享內存分離并不是刪除它,只是使該共享內存對當前進程不再可用。

#include <sys/types.h> #include <sys/shm.h>int shmdt(const void *shmaddr);shmaddr:是shmat函數返回的地址指針
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

調用成功返回0,失敗返回-1。?
4、控制共享內存(控制)

#include <sys/ipc.h> #include <sys/shm.h>int shmctl(int shm_id, int command, struct shmid_ds *buf);shm_id:是shmget函數返回的共享內存標識符command: 控制共享內存要采取的操作,可以取以下三個值: IPC_STAT : 把shmid_ds結構體中的數據設置為共享內存的當前關聯值,即用共享內存的當前關聯值覆蓋shmid_ds的值 IPC_SET : 如果進程有足夠的權限,就把共享內存當前的關聯值設置為shmid_ds結構體中給出的值 IPC_RMID : 刪除共享內存段buf : 是一個結構體指針,指向共享內存模式和訪問權限的結構體 shmid_ds結構體的成員至少包括: struct shmid_ds {uid_t shm_perm.uid;uid_t shm_perm.gid;mode_t shm_perm.mode;};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

調用成功返回0,失敗返回-1

三:編寫共享內存代碼

一般對內存區域的操作是先打開-》映射-》(操作)-》(控制)-》解除映射。?
shm.h

#ifndef _SHM_ #define _SHM_#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/wait.h> #include <unistd.h>#define _PATH_ "." #define _PROJECT_ 8888 #define _SHM_SIZE_ 4*1024int get_shm(); char *at_shm(); int delete_shm(); int rm_shm(); #endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

shm.c

#include "shm.h"int get_shm() {key_t key = ftok(_PATH_,_PROJECT_);int flag = IPC_CREAT | 0666;int shm_id = shmget(key,_SHM_SIZE_,flag);if(shm_id ==-1){printf("shmget error\n");}else{printf("shmget success\n");}return shm_id; } char *at_shm(int shm_id) {return (char*)shmat(shm_id,NULL,0); } int delete_shm(char* addr) {return shmdt(addr); } int rm_shm(int shm_id) {return shmctl(shm_id,IPC_RMID,NULL); }int main() {int shm_id = get_shm();//創建新進程pid_t id= fork();if(id<0){printf("fork error\n");return 1;}else if(id==0){//childchar *buf = at_shm(shm_id);int i = 0;while(i<4096){buf[i]= 'w';i++;}buf[4096]= '\0';delete_shm(buf);}else{//fatherchar *buf = at_shm(shm_id);sleep(3);printf("%s\n",buf);waitpid(id,NULL,0);rm_shm(shm_id);}return 0; }

總結

以上是生活随笔為你收集整理的IPC--三---共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。