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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時(shí)間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux进程间的通信----->共享内存 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

共享內(nèi)存:

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

創(chuàng)建虛擬內(nèi)存之后返回的地址空間屬于用戶空間, 不同進(jìn)程可以將同一物理內(nèi)存區(qū)域映射到各自的用戶空間中

?知道共享內(nèi)存的原理之后,開(kāi)始代碼實(shí)現(xiàn):

**首先創(chuàng)建共享內(nèi)存:

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

**第一次創(chuàng)建完共享內(nèi)存時(shí),它還不能被任何進(jìn)程訪問(wèn),shmat()函數(shù)的作用就是用來(lái)啟動(dòng)對(duì)該共享內(nèi)存的訪問(wèn),并把共享內(nèi)存連接到當(dāng)前進(jìn)程的地址空間。

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

shmat函數(shù)原型:

?如上圖所示shmat中第二個(gè)參數(shù)為空:如果為空的話,由系統(tǒng)選擇一個(gè)合適的進(jìn)程地址

?然后shmat中第三個(gè)int shmflg置為零是他要是為0? ?讀和寫的權(quán)限都有的

**然后斷開(kāi)映射 (這塊斷開(kāi)映射可有可無(wú),因?yàn)檫M(jìn)程結(jié)束后,自動(dòng)就斷開(kāi)映射了)

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

代碼統(tǒng)一起來(lái)實(shí)現(xiàn):

進(jìn)程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);//向共享內(nèi)存s中寫入數(shù)據(jù)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? 來(lái)看運(yùn)行結(jié)果:在輸入端shma.c中輸入abc? 然后輸出端shmb.c就會(huì)不停的打出abc? 直到shma.c輸入end結(jié)束輸入端? 它才會(huì)停止打印abc

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

然后下面進(jìn)行信號(hào)量的同步這兩進(jìn)程:實(shí)現(xiàn)原理

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

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

代碼實(shí)現(xiàn):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);//向共享內(nèi)存s中寫入數(shù)據(jù)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(); //該程序是最后退出的  由該程序完成信號(hào)量的銷毀
}

然后進(jìn)行可執(zhí)行程序的編譯鏈接:

?看運(yùn)行結(jié)果:

?該程序的難點(diǎn)在于僅僅使用共享內(nèi)存進(jìn)行通信的時(shí)候,輸出輸入達(dá)不到預(yù)期效果(也就是輸出端一直打印同一個(gè)值),這時(shí)候就得想到使用信號(hào)量來(lái)同步兩個(gè)進(jìn)程,來(lái)使得兩進(jìn)程可以達(dá)到通信的效果!

“能看到這里的親兄弟們,都是認(rèn)真上進(jìn)的親兄弟,加油!!!”

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人av亚洲 | 欧美日韩在线观看免费 | 在线小视频你懂的 | 一区二区国产精品 | 欧美一页 | 青青草华人在线视频 | 在线国产一区二区 | 亚洲福利影院 | av噜噜在线| 久热欧美| 国产午夜在线视频 | 在线观看污网站 | 亚洲精品精品 | 欧美久久伊人 | 天堂网在线最新版www中文网 | 国产91精品一区二区 | 性欢交69精品久久久 | 简单av在线 | 免费视频黄色 | 日韩精品人妻中文字幕 | 成熟人妻av无码专区 | sese国产 | 亚洲高清无码久久 | 伊人青青久久 | 蜜桃一区二区 | jiizzyou欧美2| 热久久国产精品 | 九色免费视频 | 天天曰天天爽 | 日本a区 | 激情女主播 | 成人亚洲精品 | 又黄又色又爽 | 色翁荡息又大又硬又粗又爽 | 国产好片无限资源 | 91蜜桃在线 | 国产在线操 | 2022精品国偷自产免费观看 | 五月激情综合网 | 国产乱码精品一区二区三区中文 | 久久精品天天中文字幕人妻 | 夜夜爽日日澡人人添 | 免费爱爱网址 | 久久人人精品 | 亚洲伦理一区二区三区 | 亚洲精品日产精品乱码不卡 | 中文av在线播放 | 欧美乱人伦 | 日韩三级精品 | 91精品国产一区二区三区蜜臀 | 国产在线一二三区 | 欧美精品激情 | 巨乳免费观看 | 乱lun合集小可的奶水 | 九九久久免费视频 | 欧美激情久久久久 | 女人脱了内裤趴开腿让男躁 | 国产免费播放 | 国产美女精品一区二区三区 | 亚洲av无码一区二区乱子伦 | 日韩两性视频 | 黄瓜视频在线免费观看 | 韩国美女主播跳舞 | 天天插av| 手机av电影在线 | 亚洲一区二区三区四区五区六区 | 黄色一级网站 | 亚洲蜜桃精久久久久久久久久久久 | 伊人伊人伊人伊人 | 国产精品乱子伦 | 成人无高清96免费 | 内谢少妇xxxxx8老少交视频 | 久久精品—区二区三区舞蹈 | h片在线| 日本a v在线播放 | 精品久久久无码中文字幕 | 亚洲一区二区三区四区五区xx | 日本大尺度做爰呻吟 | 免费午夜视频在线观看 | 久久久久久久久久久国产精品 | 嫩草影院av | 熊出没之冬日乐翻天免费高清观看 | 免费日韩毛片 | 久久久久女 | 东京热加勒比无码少妇 | 超碰凹凸 | 综合人人 | 免费观看nba乐趣影院 | www.国产一区 | 午夜精品少妇 | 在线日韩精品视频 | 91在线精品观看 | 大奶骚| 亚洲免费大片 | 91黄漫 | 国产极品在线播放 | 男女无遮挡做爰猛烈视频 | 日韩人妻无码精品久久久不卡 | 超薄肉色丝袜一二三 |