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;
}
總結
- 上一篇: 鼋头渚冬天有什么花开放
- 下一篇: 地址解析协议ARP