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

歡迎訪問 生活随笔!

生活随笔

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

生活经验

Linux进程间的通信----->共享内存

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

共享內存:

????????顧名思義,共享內存就是允許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在運行的進程之間共享和傳遞數據的一種非常有效的方式。不同進程之間共享的內存通常安排為同一段物理內存。進程可以將同一段共享內存連接到它們自己的地址空間中,所有進程都可以訪問共享內存中的地址,就好像它們是由用C語言函數malloc分配的內存一樣。而如果某個進程向共享內存寫入數據,所做的改動將立即影響到可以訪問同一段共享內存的任何其他進程。(取自博客一位大哥-->Linux進程間通信——使用共享內存_tianmo2010的專欄-CSDN博客)

創建虛擬內存之后返回的地址空間屬于用戶空間, 不同進程可以將同一物理內存區域映射到各自的用戶空間中

?知道共享內存的原理之后,開始代碼實現:

**首先創建共享內存:

int shmid = shmget((key_t)1234,128,IPC_CREAT|0600);
//1234這個可以隨意給 只要是大于0的32位整數就好
//128是共享內存空間大小
//IPC_CREAT是創建共享內存的命令  0600是權限

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

char *s = (char*)shmat(shmid,NULL,0);
//shmid就是上面shmget之后的返回值int shmid

shmat函數原型:

?如上圖所示shmat中第二個參數為空:如果為空的話,由系統選擇一個合適的進程地址

?然后shmat中第三個int shmflg置為零是他要是為0? ?讀和寫的權限都有的

**然后斷開映射 (這塊斷開映射可有可無,因為進程結束后,自動就斷開映射了)

 shmdt(s);
//s是上述共享內存的地址

代碼統一起來實現:

進程shma.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>int main()
{int shmid = shmget((key_t)1234,128,IPC_CREAT|0600);assert(shmid != -1);char *s = (char*)shmat(shmid,NULL,0);while(1){printf("input : \n");char buff[128] = {0};fgets(buff,128,stdin);strcpy(s,buff);//向共享內存s中寫入數據if(strncmp(buff,"end",3) == 0){break;}}shmdt(s);
}

shmb.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>int main()
{int shmid = shmget((key_t)1234,128,IPC_CREAT|0600);assert(shmid != -1);char *s = (char*)shmat(shmid,NULL,0);while(1){   if(strncmp(s,"end",3) == 0){break;}printf("read: %s\n",s);sleep(1);}shmdt(s);
}

ok? 來看運行結果:在輸入端shma.c中輸入abc? 然后輸出端shmb.c就會不停的打出abc? 直到shma.c輸入end結束輸入端? 它才會停止打印abc

?那么遇到這種情況該怎么辦呢?前面一篇博客我寫過 :凡是想讓進程依次運行最好的辦法就是信號量Linux編程題:信號量同步三進程依次打印若干次ABC_神廚小福貴!的博客-CSDN博客和這個是類似的問題

然后下面進行信號量的同步這兩進程:實現原理

下面所使用的sem.c? ?sem.h這些文件都在:我的另一篇博客中:

Linux編程題:信號量同步三進程依次打印若干次ABC_神廚小福貴!的博客-CSDN博客三個進程依次打印ABC.....思路及大致流程如下:思路取自這位大哥:Linux編程題:創建3個線程分別打印abc,用信號量進行同步_cleverlemon的博客-CSDN博客這位大哥寫的是線程,不需要自己封裝sem那些初始化函數,pv操作函數以及銷毀函數,這篇寫的是多進程,麻煩一些,大致思路一毛一樣來看代碼實現:先來對sem所需的初始化函數,pv操作函數,銷毀函數進行封裝:sem.h#include <stdio.h>#include <stdl.https://blog.csdn.net/qq_45829112/article/details/121222304??

代碼實現:shma.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include "sem.h"int main()
{int shmid = shmget((key_t)1234,128,IPC_CREAT|0600);assert(shmid != -1);char *s = (char*)shmat(shmid,NULL,0);sem_init();while(1){printf("input : \n");char buff[128] = {0};fgets(buff,128,stdin);sem_p(SEM1);        strcpy(s,buff);//向共享內存s中寫入數據sem_v(SEM2);if(strncmp(buff,"end",3) == 0){break;}}shmdt(s);
}

shmb.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include "sem.h"int main()
{int shmid = shmget((key_t)1234,128,IPC_CREAT|0600);assert(shmid != -1);char *s = (char*)shmat(shmid,NULL,0);sem_init();while(1){   sem_p(SEM2);if(strncmp(s,"end",3) == 0){break;}printf("read: %s\n",s);sleep(1);}shmdt(s);sem_destroy(); //該程序是最后退出的  由該程序完成信號量的銷毀
}

然后進行可執行程序的編譯鏈接:

?看運行結果:

?該程序的難點在于僅僅使用共享內存進行通信的時候,輸出輸入達不到預期效果(也就是輸出端一直打印同一個值),這時候就得想到使用信號量來同步兩個進程,來使得兩進程可以達到通信的效果!

“能看到這里的親兄弟們,都是認真上進的親兄弟,加油!!!”

總結

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

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