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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

IPC--共享内存

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

有了之前的學習經驗,共享內存對我們學習起來相對簡單一些了,這里簡單說說共享內存的一些,然后對于函數的分析直接在代碼里面的注釋部分有說明,如果還是不懂,可以先看看前面的關于IPC–信號量還有IPC–消息隊列的講解

共享內存以傳遞數據為目的,速度最快,不需要數據在內存還物理內存的來回的拷貝,直接訪問訪問虛擬地址空間

共享內存沒有同步與互斥機制,這個時候我們可以結合著IPC–信號量進行進程間通信

下面我們直接粘貼代碼

client.c

#include"comm.h"int main()
{int shmid = getShm(0);int i = 0;char* arr = (char*)shmat(shmid,NULL,0);while(1){sleep(1);printf("%s\n",arr);i++;if(i==25)break;}int dt =  shmdt(arr);if(dt < 0){perror("shmdt\n");return -1;}return 0;
}

comm.c

#include"comm.h"static int commShm(int size,int flag)   //size:共享內存的大小,flag:進行何種操作,是獲取還是創建
{key_t key = ftok(PATHNAME,ID);if(key < 0){perror("key_t\n");return -1;}int shmid = shmget(key,size,flag);  //key:鍵值,size:大小,這里傳入的大小最好是4k(4096)的倍數//因為4096是一頁,如果我們傳遞的是4097,系統會自動的對齊到8192,//但是因為我們申請的是4097,剩下的內存系統不會給你,flag:創建方式if(shmid < 0){perror("shmget\n");return -2;}return shmid;
}int creatShm(int size) //size:創建內存空間的大小
{return commShm(size,IPC_CREAT|IPC_EXCL|0666);
}int getShm(int size)
{return commShm(size,IPC_CREAT);   //size:默認設置為0
}int desShm(int shmid)
{int des = shmctl(shmid,IPC_RMID,NULL);    //shmid:刪除的是哪一個共享內存,IPC_RMID:控制方式,這里是刪除的意思//NULL:這里是struct shmid_ds *buf,這是一個維護共享 內存的一個結構體//暫時不關心if(des < 0){perror("shmctl\n");return -1;}return des;
}

comm.h

#ifndef _COMM_H_
#define _COMM_H_#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>#define PATHNAME "."
#define ID 0x6666int creatShm(int size);
int getShm(int size);
int desShm(int shmid);#endif

server.c

#include"comm.h"int main()
{int i = 0;int shmid = creatShm(27);char* arr = (char*)shmat(shmid,NULL,0);   //這里可以把shmat當成是malloc使用,shmid:信號量標識符//NULL:const void* shmaddr,虛擬地址空間,設置為NULL,這個是系統自己定義的//返回值void* 這個時候我們要強制轉換成我們需要的類型for(;i<26;){sleep(1);arr[i] = 'A' + i;   //這里可以直接當成是malloc開辟的一個數組使用i++;arr[i] = 0;}int dt =  shmdt(arr);   //arr:這個就是我們上面的那個內存空間地址if(dt < 0){perror("shmdt\n");return -1;}desShm(shmid);return 0;
}

總結

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

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