您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關大數據進程間通信的共享內存是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
共享內存:
用于進程之間的數據傳遞,是system v版本中最高效的,但是它不會同步與互斥,所以常與信號量搭配使用。
nattch:表示有多少個進程掛接在共享內存上。要查看其值用 ipcs -m 命令
刪除key值用 ipcrm -m +key值;
圖形理解共享內存:
#include <sys/types.h>
#include <sys/shm.h>
1.創建共享內存函數:
int shget(key_t key,size_t size, int shmflg* buf);
第二個參數是其大小,一般為4k 即4096的整數倍;
第三個參數一般為:IPC_CREAT|IPC_EXCL;
2.銷毀共享內存的函數:
int shmctl(int shm _id,int cmd,int shmflg* buf);
第二個參數一般為:IPC_RMID;
3.掛接在共享內存上:
void *shmat(int shmid, const void *shmaddr, int shmflg);
4.去關聯共享內存
int shmdt(const void *shmaddr);
共享內存實現代碼:
//comm.h 1 #include<stdio.h> 2 #include<sys/ipc.h> 3 #include<sys/shm.h> 4 #include<stdlib.h> 5 #include<unistd.h> 6 #define _PATH_ "." 7 #define _PROJ_ID_ 0X7777 8 #define _SIZE_ 4096 9 int shm_create() 10 { 11 key_t key=ftok(_PATH_, _PROJ_ID_); 12 if(key<0) 13 { 14 perror("ftok"); 15 return -1; 16 } 17 int shm_id=shmget(key,_SIZE_,IPC_CREAT|IPC_EXCL|0666); 18 if(shm_id<0) 19 { 20 perror("shmget"); 21 return -1; 22 } 23 return shm_id; 24 } 25 26 int shm_get() 27 { 28 29 30 key_t key=ftok(_PATH_, _PROJ_ID_); 31 if(key<0) 32 { 33 perror("ftok"); 34 return -1; 35 } 36 int shm_id=shmget(key,_SIZE_,IPC_CREAT);//得到的是已創建好的 37 if(shm_id<0) 38 { 39 perror("shmget"); 40 return -1; 41 } 42 return shm_id; 43 44 } //server.c 1 #include"comm.h" 2 3 int main() 4 { 5 int shm_id=shm_create(); 6 sleep(10); 7 char *start=at_shm(shm_id); 8 int i; 9 for(i=0;i<20;++i) 10 { 11 12 printf("%s\n",start); 13 sleep(1); 14 15 } 16 dt_shm(start); 17 shm_destroy(shm_id); 18 return 0; 19 } //client.c 1 #include"comm.h" 2 3 int main() 4 { 5 int shm_id=shm_get(); 6 sleep(5); 7 char *start=at_shm(shm_id); 8 int i; 9 for(i=0;i<20;++i) 10 { 11 start[i]='A'; 12 start[i+1]='\0'; 13 } 14 sleep(7); 15 dt_shm(start); 16 sleep(12); 17 return 0; 18 19 20 21 22 } //Makefile 1 .PHONY:all 2 all:server client 3 server:server.c 4 gcc -o $@ $^ 5 client:client.c 6 gcc -o $@ $^ 7 .PHONY:clean 8 clean: 9 rm -f server client
:
結果分析:
當server.c 運行起來時顯示器上沒有東西,當client.c運行起來打印東西時,這時的server也可以讀到內容將其顯示在顯示器上。這樣實現了不同進程之間的通信,通過共享內存。
以上就是大數據進程間通信的共享內存是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。