linux使用共享內(nèi)存通信的進(jìn)程同步退出問(wèn)題
两个甚至多个进程使用共享内存(shm)通信,总遇到同步问题。这里的“同步问题”不是说进程读写同步问题,这个用信号量就好了。这里的同步问题说的是同步退出问题,到底谁先退出,怎么知道对方退出了。举个例子:进程负责读写数据库A,进程B负责处理数据。那么进程A得比进程B晚退出才行,因为要保存进程B处理完的数据。可是A不知道B什么时候退出啊。A、B是无关联的进程,也不知道对方的pid。它们唯一的关联就是读写同一块共享内存。正常情况下,进程B在共享内存中写个标识:进程A你可以退出了,也是可以的。不过进程B可能是异常退出,连标识都来不及写。其次,共享内存用来做数据通信的,加这么个标识感觉不太好,有滥用的感觉。
采用socket通信没有这个问题,因为进程B退出怎么也会导致socket断开,哪怕是超时。但shm却没有协议来检测这些行为,如果自己也做一个未免太麻烦。那就从共享内存下手吧。
共享内存是由内核来管理的,一个进程删除本身打开的共享内存并不影响另一个进程的共享内存,哪怕都是同一块共享内存。这是因为共享内存在内核中一个引用计数,一个进程使用该共享内存就会导致引用计数加1。如果其中一个进程调用了删除函数,只有这个计数为0才会真正删除共享内存。那么,需要最后才退出的进程检测这个计数就可以了。
在System V的共享内存中,创建一个共享内存会初始化一个结构:
复制代码代码如下:
struct shmid_ds {
struct ipc_perm shm_perm;/ Ownership and permissions /
size_tshm_segsz; / Size of segment (bytes) /
time_tshm_atime; / Last attach time /
time_tshm_dtime; / Last detach time /
time_tshm_ctime; / Last change time /
pid_t shm_cpid;/ PID of creator /
pid_t shm_lpid;/ PID of last shmat(2)/shmdt(2) /
shmatt_tshm_nattch;/ No. of current attaches /
...
};
使用shmctl函数可以读取该结构体,其中的shm_nattch就是使用该共享内存的进程数。
不过,现在有了新的POSIX标准,当然要用新标准了。shm_open创建的共享内存也具有“一个进程删除本身打开的共享内存并不影响另一个进程的共享内存”的特点。可是用shm_open创建的共享内存不再有上面的结构,那么,内核是怎么管理shm_open创建共享内存??看下面的源码:
复制代码代码如下:
/ shm_open - open a shared memory file //p
/ Copyright 2002, Red Hat Inc. /
#include
#include
#include
#include
#include
#include
int
shm_open (const char name, int oflag, mode_t mode)
{
int fd;
char shm_name[PATH_MAX+20] = "/dev/shm/";
/ skip opening slash /
if (name == '/')
++name;
/ create special shared memory file name and leave enough space to
cause a path/name error if name is too long /
strlcpy (shm_name + 9, name, PATH_MAX + 10);
fd = open (shm_name, oflag, mode);
if (fd != -1)
{
/ once open we must add FD_CLOEXEC flag to file descriptor /
int flags = fcntl (fd, F_GETFD, 0);
if (flags >= 0)
{
flags |= FD_CLOEXEC;
flags = fcntl (fd, F_SETFD, flags);
}
/ on failure, just close file and give up /
if (flags == -1)
{
close (fd);
fd = -1;
}
}
return fd;
}
我嚓,这就是创建一个普通的文件啊,只是创建的位置在/dev/shm下(也就是RAM上)。再来看看删除共享内存的函数shm_unlink:
复制代码代码如下:
/ shm_unlink - remove a shared memory file //p
/ Copyright 2002, Red Hat Inc. /
#include
#include
#include
#include
#include
int
shm_unlink (const char name)
{
int rc;
char shm_name[PATH_MAX+20] = "/dev/shm/";
/ skip opening slash /
if (name == '/')
++name;
/ create special shared memory file name and leave enough space to
cause a path/name error if name is too long /
strlcpy (shm_name + 9, name, PATH_MAX + 10);
rc = unlink (shm_name);
return rc;
}
这也只是一个普通的unlink函数。也就是说,POSIX标准的共享内存就是一个文件。所谓的“一个进程删除本身打开的共享内存并不影响另一个进程的共享内存”就相当于你用fstream对象打开了一个文件,然后去文件夹把文件删除了(也就是对文件进行了unlink操作),可是fstream对象还可以正常读写文件,并没有什么引用计数。这下好了,进程退出时又没法同步了。
不过,在linux下怎么会有解决不了的问题呢?解决不了只能说明自己太菜。既然是文件,那就从文件下手。那文件有什么是原子操作,又可以计数的呢。答案:硬链接。比如:
复制代码代码如下:
xzc@xzc-HP-ProBook-4446s:/dev/shm$ stat abc
文件:"abc"
大小:4 块:8IO 块:4096 普通文件
设备:15h/21dInode:5743159 硬链接:1
权限:(0664/-rw-rw-r--)Uid:( 1000/ xzc) Gid:( 1000/ xzc)
最近访问:2015-01-25 21:27:00.961053098 +0800
最近更改:2015-01-25 21:27:00.961053098 +0800
最近改动:2015-01-25 21:27:00.961053098 +0800
创建时间:-
xzc@xzc-HP-ProBook-4446s:/dev/shm$
这个硬链接可以通过fstat函数获取。可是要这样实现的话,意味着需要先创建一块共享内存,每个进程引用的时候需要调用link函数来创建一个硬链接。问题解决了,可是这样会在/dev/shm下多个N多个文件。这可是RAM啊,虽然现在的服务器都比较牛,但这样做也不太好吧。好吧,还有一个flock文件锁。flock使用LOCK_SH参数多个进程对同一个文件加锁。这样,进程B初始化共享内存时加锁(可以有多个这样的进程),在退出(包括异常退出)时解锁。进程A在退出时检测这个锁。当发现无锁时说明可以安全退出了。
同步退出的问题基本解决了。来不及写代码去验证,下次吧。
PS:内核unlink时应该也是有计数才知道当前有没有进程打开文件,在什么时候应该删除文件。这个还得去查资料,看用不用得上。另外lsof这个工具是可以检测到所有打开该共享内存的进程及相应的状态。这个应该也是有对应的api的,只是现在还没搞懂。
推薦系統(tǒng)
雨林木風(fēng) winxp下載 純凈版 永久激活 winxp ghost系統(tǒng) sp3 系統(tǒng)下載
系統(tǒng)大?。?/em>0MB系統(tǒng)類(lèi)型:WinXP雨林木風(fēng)在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國(guó)內(nèi)重裝系統(tǒng)行業(yè)知名品牌,雨林木風(fēng)WindowsXP其系統(tǒng)口碑得到許多人認(rèn)可,積累了廣大的用戶(hù)群體,是一款穩(wěn)定流暢的系統(tǒng),雨林木風(fēng) winxp下載 純凈版 永久激活 winxp ghost系統(tǒng) sp3 系統(tǒng)下載,有需要的朋友速度下載吧。
系統(tǒng)等級(jí):進(jìn)入下載 >蘿卜家園win7純凈版 ghost系統(tǒng)下載 x64 聯(lián)想電腦專(zhuān)用
系統(tǒng)大?。?/em>0MB系統(tǒng)類(lèi)型:Win7蘿卜家園win7純凈版是款非常純凈的win7系統(tǒng),此版本優(yōu)化更新了大量的驅(qū)動(dòng),幫助用戶(hù)們進(jìn)行舒適的使用,更加的適合家庭辦公的使用,方便用戶(hù),有需要的用戶(hù)們快來(lái)下載安裝吧。
系統(tǒng)等級(jí):進(jìn)入下載 >雨林木風(fēng)xp系統(tǒng) xp系統(tǒng)純凈版 winXP ghost xp sp3 純凈版系統(tǒng)下載
系統(tǒng)大?。?/em>1.01GB系統(tǒng)類(lèi)型:WinXP雨林木風(fēng)xp系統(tǒng) xp系統(tǒng)純凈版 winXP ghost xp sp3 純凈版系統(tǒng)下載,雨林木風(fēng)WinXP系統(tǒng)技術(shù)積累雄厚深耕多年,采用了新的系統(tǒng)功能和硬件驅(qū)動(dòng),可以更好的發(fā)揮系統(tǒng)的性能,優(yōu)化了系統(tǒng)、驅(qū)動(dòng)對(duì)硬件的加速,加固了系統(tǒng)安全策略,運(yùn)行環(huán)境安全可靠穩(wěn)定。
系統(tǒng)等級(jí):進(jìn)入下載 >蘿卜家園win10企業(yè)版 免激活密鑰 激活工具 V2023 X64位系統(tǒng)下載
系統(tǒng)大小:0MB系統(tǒng)類(lèi)型:Win10蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國(guó)內(nèi)重裝系統(tǒng)行業(yè)的蘿卜家園品牌,(win10企業(yè)版,win10 ghost,win10鏡像),蘿卜家園win10企業(yè)版 免激活密鑰 激活工具 ghost鏡像 X64位系統(tǒng)下載,其系統(tǒng)口碑得到許多人認(rèn)可,積累了廣大的用戶(hù)群體,蘿卜家園win10純凈版是一款穩(wěn)定流暢的系統(tǒng),一直以來(lái)都以用戶(hù)為中心,是由蘿卜家園win10團(tuán)隊(duì)推出的蘿卜家園
系統(tǒng)等級(jí):進(jìn)入下載 >蘿卜家園windows10游戲版 win10游戲?qū)I(yè)版 V2023 X64位系統(tǒng)下載
系統(tǒng)大?。?/em>0MB系統(tǒng)類(lèi)型:Win10蘿卜家園windows10游戲版 win10游戲?qū)I(yè)版 ghost X64位 系統(tǒng)下載,蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國(guó)內(nèi)重裝系統(tǒng)行業(yè)的蘿卜家園品牌,其系統(tǒng)口碑得到許多人認(rèn)可,積累了廣大的用戶(hù)群體,蘿卜家園win10純凈版是一款穩(wěn)定流暢的系統(tǒng),一直以來(lái)都以用戶(hù)為中心,是由蘿卜家園win10團(tuán)隊(duì)推出的蘿卜家園win10國(guó)內(nèi)鏡像版,基于國(guó)內(nèi)用戶(hù)的習(xí)慣,做
系統(tǒng)等級(jí):進(jìn)入下載 >windows11下載 蘿卜家園win11專(zhuān)業(yè)版 X64位 V2023官網(wǎng)下載
系統(tǒng)大?。?/em>0MB系統(tǒng)類(lèi)型:Win11蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,windows11下載 蘿卜家園win11專(zhuān)業(yè)版 X64位 官網(wǎng)正式版可以更好的發(fā)揮系統(tǒng)的性能,優(yōu)化了系統(tǒng)、驅(qū)動(dòng)對(duì)硬件的加速,使得軟件在WINDOWS11系統(tǒng)中運(yùn)行得更加流暢,加固了系統(tǒng)安全策略,WINDOWS11系統(tǒng)在家用辦公上跑分表現(xiàn)都是非常優(yōu)秀,完美的兼容各種硬件和軟件,運(yùn)行環(huán)境安全可靠穩(wěn)定。
系統(tǒng)等級(jí):進(jìn)入下載 >
相關(guān)文章
- 《巫師3:狂獵》游戲中因缺失steam_api64.dll文件導(dǎo)致的問(wèn)題應(yīng)該如何解決
- 解決《巫師3:狂獵》游戲中因缺失nvapi64.dll文件導(dǎo)致的問(wèn)題
- 解決《巫師3:狂獵》游戲中因缺失phyx3common_64.dll文件導(dǎo)致的問(wèn)題
- NBA 2K19啟動(dòng)故障的深度解析與應(yīng)對(duì)策略——解決缺失msvcr110.dll文件的問(wèn)題
- 解決《英雄連2》游戲中steam_api.dll文件丟失導(dǎo)致無(wú)法啟動(dòng)的問(wèn)題
- 解決《勇者斗惡龍:英雄》游戲中丟失steam_api64.dll文件的問(wèn)題
- 解決《勇者斗惡龍:英雄》游戲中缺失msvcp110.dll文件的問(wèn)題
- PUBG(絕地求生)因缺失DLL文件導(dǎo)致無(wú)法啟動(dòng)的全方位解決方案及深度解析
- 當(dāng)電腦C盤(pán)滿(mǎn)載時(shí),如何科學(xué)、高效地進(jìn)行清理與釋放空間
- NewtabPro瀏覽器插件:集合ChatGPT、PDF轉(zhuǎn)換、OCR識(shí)別、谷歌翻譯及趣味減壓功能于一體的高效在線(xiàn)工具
- win11任務(wù)欄圖標(biāo)變黑變暗怎么辦?win11任務(wù)欄圖標(biāo)變暗處理教程分享
- win11搜索欄一直在加載無(wú)法使用深入解決方法分享
- win11休眠后喚醒點(diǎn)擊圖標(biāo)沒(méi)反應(yīng)?win11休眠后喚醒點(diǎn)擊圖標(biāo)沒(méi)反應(yīng)全方位解決指南
- 設(shè)置壁紙后不能鋪滿(mǎn)屏幕電腦桌面的邊緣顯示黑邊怎么處理?
熱門(mén)系統(tǒng)
推薦軟件
推薦應(yīng)用
推薦游戲
熱門(mén)文章
常用系統(tǒng)
- 1win11最新純凈版下載 番茄花園x64位精簡(jiǎn)版 GHOST鏡像 宏基筆記本專(zhuān)用下載
- 2win11家庭版下載 技術(shù)員聯(lián)盟64位經(jīng)典珍藏版 官網(wǎng)鏡像下載 無(wú)需激活密鑰
- 3深度技術(shù)win10旗艦版中文簡(jiǎn)體系統(tǒng)21H2 X64位 V2022.05下載
- 4技術(shù)員聯(lián)盟Windows11精簡(jiǎn)版 純凈系統(tǒng) 完美激活 ghost系統(tǒng) ISO鏡像 X64位 V2022.07下載
- 5技術(shù)員聯(lián)盟WIN11家庭專(zhuān)用版 ISO鏡像 X64位 V2022.07下載
- 6Windows10最新穩(wěn)定版下載 外星人系統(tǒng) 激活密鑰 戴爾筆記本專(zhuān)用下載
- 7【萬(wàn)能驅(qū)動(dòng)】Ghost Win7 SP1 32位 旗艦版系統(tǒng)鏡像
- 8雨林木風(fēng) Ghost Win10 X64位 通用專(zhuān)業(yè)版v2023.11
- 9win11旗艦版下載 青蘋(píng)果系統(tǒng) 64位獨(dú)立新機(jī)版下載 GHOST鏡像 v2023