校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > linux使用共享內存通信的進程同步退出問題

linux使用共享內存通信的進程同步退出問題

熱門標簽:電話機器人哪里有賣的 新鄭電銷外呼系統線路 河北語音電銷機器人 壽光百度地圖標注中心網站 商戶地圖標注 怎樣給景區加百度地圖標注 樺甸電銷機器人 河南智能電話機器人公司 地球地圖標注方法

兩個甚至多個進程使用共享內存(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_t shm_segsz; /* Size of segment (bytes) */
time_t shm_atime; /* Last attach time */
time_t shm_dtime; /* Last detach time */
time_t shm_ctime; /* Last change time */
pid_t shm_cpid; /* PID of creator */
pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */
shmatt_t shm_nattch; /* No. of current attaches */
...
};

使用shmctl函數可以讀取該結構體,其中的shm_nattch就是使用該共享內存的進程數。

  不過,現在有了新的POSIX標準,當然要用新標準了。shm_open創建的共享內存也具有“一個進程刪除本身打開的共享內存并不影響另一個進程的共享內存”的特點。可是用shm_open創建的共享內存不再有上面的結構,那么,內核是怎么管理shm_open創建共享內存??看下面的源碼:


復制代碼
代碼如下:

/* shm_open - open a shared memory file *//p> p>/* Copyright 2002, Red Hat Inc. *//p> p>#include sys/types.h>
#include sys/mman.h>
#include unistd.h>
#include string.h>
#include fcntl.h>
#include limits.h>/p> p>int
shm_open (const char *name, int oflag, mode_t mode)
{
int fd;
char shm_name[PATH_MAX+20] = "/dev/shm/";/p> p> /* skip opening slash */
if (*name == '/')
++name;/p> p> /* 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);/p> p> fd = open (shm_name, oflag, mode);/p> p> if (fd != -1)
{
/* once open we must add FD_CLOEXEC flag to file descriptor */
int flags = fcntl (fd, F_GETFD, 0);/p> p> if (flags >= 0)
{
flags |= FD_CLOEXEC;
flags = fcntl (fd, F_SETFD, flags);
}/p> p> /* on failure, just close file and give up */
if (flags == -1)
{
close (fd);
fd = -1;
}
}/p> p> return fd;
}

我嚓,這就是創建一個普通的文件啊,只是創建的位置在/dev/shm下(也就是RAM上)。再來看看刪除共享內存的函數shm_unlink:


復制代碼
代碼如下:

/* shm_unlink - remove a shared memory file *//p> p>/* Copyright 2002, Red Hat Inc. *//p> p>#include sys/types.h>
#include sys/mman.h>
#include unistd.h>
#include string.h>
#include limits.h>/p> p>int
shm_unlink (const char *name)
{
int rc;
char shm_name[PATH_MAX+20] = "/dev/shm/";/p> p> /* skip opening slash */
if (*name == '/')
++name;/p> p> /* 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);/p> p> rc = unlink (shm_name);/p> p> return rc;
}

這也只是一個普通的unlink函數。也就是說,POSIX標準的共享內存就是一個文件。所謂的“一個進程刪除本身打開的共享內存并不影響另一個進程的共享內存”就相當于你用fstream對象打開了一個文件,然后去文件夾把文件刪除了(也就是對文件進行了unlink操作),可是fstream對象還可以正常讀寫文件,并沒有什么引用計數。這下好了,進程退出時又沒法同步了。

  不過,在linux下怎么會有解決不了的問題呢?解決不了只能說明自己太菜。既然是文件,那就從文件下手。那文件有什么是原子操作,又可以計數的呢。答案:硬鏈接。比如:


復制代碼
代碼如下:

xzc@xzc-HP-ProBook-4446s:/dev/shm$ stat abc
文件:"abc"
大小:4 塊:8 IO 塊:4096 普通文件
設備:15h/21d Inode: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的,只是現在還沒搞懂。

標簽:阜陽 來賓 迪慶 忻州 遼陽 荊州 楚雄 淄博

巨人網絡通訊聲明:本文標題《linux使用共享內存通信的進程同步退出問題》,本文關鍵詞  linux,使用,共享,內存,通信,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《linux使用共享內存通信的進程同步退出問題》相關的同類信息!
  • 本頁收集關于linux使用共享內存通信的進程同步退出問題的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    午夜av一区二区三区| 最新热久久免费视频| 国产午夜精品一区二区三区视频 | 精品一区二区免费视频| 欧美色综合影院| 亚洲国产精品久久人人爱蜜臀| 91美女精品福利| 亚洲韩国一区二区三区| 在线综合视频播放| 紧缚奴在线一区二区三区| 久久综合久久综合亚洲| 成人免费不卡视频| 亚洲一区二区综合| 精品国产乱码91久久久久久网站| 国产精品99久久久久久久女警 | 久久久青草青青国产亚洲免观| 麻豆国产一区二区| 欧美精彩视频一区二区三区| 一本色道久久加勒比精品| 日韩黄色片在线观看| 精品久久久三级丝袜| 99久久99久久综合| 日本视频在线一区| 亚洲视频1区2区| 日韩欧美成人一区| 91在线观看成人| 蜜臀久久99精品久久久画质超高清 | 制服视频三区第一页精品| 国内精品国产成人| 亚洲视频图片小说| 久久综合色婷婷| 欧美精品自拍偷拍动漫精品| 高清av一区二区| 天堂影院一区二区| 亚洲男人天堂一区| 久久久99精品久久| 88在线观看91蜜桃国自产| yourporn久久国产精品| 久久丁香综合五月国产三级网站| 亚洲精品老司机| 国产日产欧美一区| 欧美欧美午夜aⅴ在线观看| 激情文学综合丁香| 一区二区三区日本| 久久久欧美精品sm网站| 欧美日韩一区小说| 91丨九色丨尤物| 麻豆视频观看网址久久| 亚洲欧美电影一区二区| 精品国内二区三区| 91黄色在线观看| 成人开心网精品视频| 天天亚洲美女在线视频| 一区二区三区国产豹纹内裤在线 | 亚洲精品国产第一综合99久久 | 一本到三区不卡视频| 国产成人午夜精品影院观看视频| 视频一区二区欧美| 一区二区三区四区五区视频在线观看| 国产无一区二区| 国产亚洲1区2区3区| 欧美白人最猛性xxxxx69交| 欧美日本国产视频| 欧美日韩一级视频| 欧美久久高跟鞋激| 欧美日韩三级在线| 欧美系列日韩一区| 欧美另类videos死尸| 欧美影院午夜播放| 欧美性感一类影片在线播放| 欧美色精品在线视频| 在线观看日韩av先锋影音电影院| 99视频超级精品| 91丨porny丨首页| 色婷婷一区二区| 欧美日韩精品三区| 日韩写真欧美这视频| 日韩精品中文字幕在线不卡尤物| 欧美一卡2卡三卡4卡5免费| 欧美一区二区福利视频| 精品国产污污免费网站入口| 欧美精品一区二区三区在线 | 日本中文字幕一区二区视频| 午夜久久久久久| 日本欧美肥老太交大片| 激情丁香综合五月| 国产成a人无v码亚洲福利| 99久久国产综合精品麻豆| 色哟哟精品一区| 欧美日韩美女一区二区| 精品欧美一区二区在线观看| 国产精品天干天干在观线| 亚洲成人av一区| 狠狠色伊人亚洲综合成人| 色域天天综合网| 久久蜜桃av一区二区天堂| 一区二区三区丝袜| 国产精品一区二区91| 欧美日韩一区成人| 国产精品视频一二三| 免费高清视频精品| 99综合电影在线视频| 日韩欧美一级精品久久| 亚洲欧美另类久久久精品2019| 蜜臀va亚洲va欧美va天堂 | 色综合久久综合| 精品国免费一区二区三区| 综合激情成人伊人| 国精产品一区一区三区mba桃花| 国产一区二区三区电影在线观看 | 91伊人久久大香线蕉| 精品国产一区a| 午夜精品一区二区三区电影天堂| 久久精品国产成人一区二区三区 | 国产亚洲精品精华液| 午夜精品在线看| 欧洲一区二区三区免费视频| 国产欧美综合在线观看第十页| 亚洲gay无套男同| 国产精品白丝jk白祙喷水网站| 日韩视频一区二区三区在线播放| 欧美本精品男人aⅴ天堂| 亚洲综合精品久久| 国产精品一区在线观看你懂的| 在线视频一区二区免费| 亚洲天堂a在线| 久久国产日韩欧美精品| 欧洲亚洲国产日韩| 欧美国产视频在线| 亚洲高清免费在线| 国产成人aaa| 欧美乱妇15p| 亚洲女人****多毛耸耸8| 国产综合色视频| 久久先锋影音av| 日本欧美加勒比视频| 91久久久免费一区二区| 久久久天堂av| 精品一区二区三区免费观看| 91精品国产一区二区三区蜜臀 | 日韩精品亚洲一区| 欧美性大战xxxxx久久久| 国产精品久久久久婷婷二区次| 青草av.久久免费一区| 欧美伊人久久大香线蕉综合69| 中文字幕第一页久久| 狠狠色狠狠色综合日日91app| 8x福利精品第一导航| 亚洲一区二区视频在线观看| 不卡的av电影| 国产精品入口麻豆九色| 精品一区二区在线视频| 久久精品欧美日韩精品| 久久爱另类一区二区小说| 欧美电影影音先锋| 午夜精品福利视频网站| 欧美日韩夫妻久久| 午夜精品久久一牛影视| 欧美日韩成人激情| 亚洲电影一级片| 欧美日韩国产综合视频在线观看| 一区二区三区四区精品在线视频| 色综合中文综合网| 欧美日韩国产成人在线91| 国产欧美一区二区在线| 91在线视频免费观看| 国产精品色一区二区三区| 粉嫩av亚洲一区二区图片| 国产日韩欧美综合在线| 国产999精品久久久久久绿帽| 国产精品伦一区二区三级视频| 国产98色在线|日韩| 中文字幕一区二区三区在线观看 | 亚洲一区二区三区激情| 欧美亚洲综合色| 亚洲a一区二区| 欧美一级欧美一级在线播放| 成人一道本在线| 亚洲视频免费观看| 欧美日韩免费观看一区二区三区 | 亚洲午夜在线视频| 久久久精品免费免费| 亚洲电影在线播放| 久久综合九色综合欧美98| 高清日韩电视剧大全免费| 国产精品国产精品国产专区不蜜| 国产高清一区日本| 一区二区三区日韩欧美精品 | 在线播放中文字幕一区| 久久精品免费观看| 国产精品视频免费| 欧美日韩一区二区在线观看视频| 日本 国产 欧美色综合| 国产日韩精品一区| 欧美色爱综合网| 国产精品一区在线观看你懂的| 1024国产精品| 中文字幕av不卡| 欧美精品成人一区二区三区四区| 国产精品一区二区在线观看不卡 |