如何实现Linux共享内存实现原理聊天室

117781人阅读
初学Linux(27)
下面将讲解进程间通信的另一种方式,使用共享内存。一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。有关信号量的更多内容,可以查阅我的另一篇文章:二、共享内存的使得与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h中。1、shmget函数该函数用来创建共享内存,它的原型为:int shmget(key_t key, size_t size, int shmflg);第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。第二个参数,size以字节为单位指定需要共享的内存容量第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。2、shmat函数第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。它的原型如下:void *shmat(int shm_id, const void *shm_addr, int shmflg);第一个参数,shm_id是由shmget函数返回的共享内存标识。第二个参数,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。第三个参数,shm_flg是一组标志位,通常为0。调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.3、shmdt函数该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。它的原型如下:int shmdt(const void *shmaddr);参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.4、shmctl函数与信号量的semctl函数一样,用来控制共享内存,它的原型如下:int shmctl(int shm_id, int command, struct shmid_ds *buf);第一个参数,shm_id是shmget函数返回的共享内存标识符。第二个参数,command是要采取的操作,它可以取下面的三个值 :& & IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。& & IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值& & IPC_RMID:删除共享内存段第三个参数,buf是一个结构指针,它指向共享内存模式和访问权限的结构。shmid_ds结构至少包括以下成员:struct shmid_ds
uid_t shm_perm.
uid_t shm_perm.
mode_t shm_perm.
};三、使用共享内存进行进程间通信说了这么多,又到了实战的时候了。下面就以两个不相关的进程来说明进程间如何通过共享内存来进行通信。其中一个文件shmread.c创建共享内存,并读取其中的信息,另一个文件shmwrite.c向共享内存中写入数据。为了方便操作和数据结构的统一,为这两个文件定义了相同的数据结构,定义在文件shmdata.c中。结构shared_use_st中的written作为一个可读或可写的标志,非0:表示可读,0表示可写,text则是内存中的文件。shmdata.h的源代码如下:#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER
#define TEXT_SZ 2048
struct shared_use_st
//作为一个标志,非0:表示可读,0表示可写
char text[TEXT_SZ];//记录写入和读取的文本
#endif源文件shmread.c的源代码如下:#include &unistd.h&
#include &stdlib.h&
#include &stdio.h&
#include &sys/shm.h&
#include &shmdata.h&
int main()
int running = 1;//程序是否继续运行的标志
void *shm = NULL;//分配的共享内存的原始首地址
struct shared_use_st *//指向shm
//共享内存标识符
//创建共享内存
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
if(shmid == -1)
fprintf(stderr, &shmget failed\n&);
exit(EXIT_FAILURE);
//将共享内存连接到当前进程的地址空间
shm = shmat(shmid, 0, 0);
if(shm == (void*)-1)
fprintf(stderr, &shmat failed\n&);
exit(EXIT_FAILURE);
printf(&\nMemory attached at %X\n&, (int)shm);
//设置共享内存
shared = (struct shared_use_st*)
shared-&written = 0;
while(running)//读取共享内存中的数据
//没有进程向共享内存定数据有数据可读取
if(shared-&written != 0)
printf(&You wrote: %s&, shared-&text);
sleep(rand() % 3);
//读取完数据,设置written使共享内存段可写
shared-&written = 0;
//输入了end,退出循环(程序)
if(strncmp(shared-&text, &end&, 3) == 0)
running = 0;
else//有其他进程在写数据,不能读取数据
//把共享内存从当前进程中分离
if(shmdt(shm) == -1)
fprintf(stderr, &shmdt failed\n&);
exit(EXIT_FAILURE);
//删除共享内存
if(shmctl(shmid, IPC_RMID, 0) == -1)
fprintf(stderr, &shmctl(IPC_RMID) failed\n&);
exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}源文件shmwrite.c的源代码如下:#include &unistd.h&
#include &stdlib.h&
#include &stdio.h&
#include &string.h&
#include &sys/shm.h&
#include &shmdata.h&
int main()
int running = 1;
void *shm = NULL;
struct shared_use_st *shared = NULL;
char buffer[BUFSIZ + 1];//用于保存输入的文本
//创建共享内存
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
if(shmid == -1)
fprintf(stderr, &shmget failed\n&);
exit(EXIT_FAILURE);
//将共享内存连接到当前进程的地址空间
shm = shmat(shmid, (void*)0, 0);
if(shm == (void*)-1)
fprintf(stderr, &shmat failed\n&);
exit(EXIT_FAILURE);
printf(&Memory attached at %X\n&, (int)shm);
//设置共享内存
shared = (struct shared_use_st*)
while(running)//向共享内存中写数据
//数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本
while(shared-&written == 1)
printf(&Waiting...\n&);
//向共享内存中写入数据
printf(&Enter some text: &);
fgets(buffer, BUFSIZ, stdin);
strncpy(shared-&text, buffer, TEXT_SZ);
//写完数据,设置written使共享内存段可读
shared-&written = 1;
//输入了end,退出循环(程序)
if(strncmp(buffer, &end&, 3) == 0)
running = 0;
//把共享内存从当前进程中分离
if(shmdt(shm) == -1)
fprintf(stderr, &shmdt failed\n&);
exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}再来看看运行的结果:分析:1、程序shmread创建共享内存,然后将它连接到自己的地址空间。在共享内存的开始处使用了一个结构struct_use_st。该结构中有个标志written,当共享内存中有其他进程向它写入数据时,共享内存中的written被设置为0,程序等待。当它不为0时,表示没有进程对共享内存写入数据,程序就从共享内存中读取数据并输出,然后重置设置共享内存中的written为0,即让其可被shmwrite进程写入数据。2、程序shmwrite取得共享内存并连接到自己的地址空间中。检查共享内存中的written,是否为0,若不是,表示共享内存中的数据还没有被完,则等待其他进程读取完成,并提示用户等待。若共享内存的written为0,表示没有其他进程对共享内存进行读取,则提示用户输入文本,并再次设置共享内存中的written为1,表示写完成,其他进程可对共享内存进行读操作。四、关于前面的例子的安全性讨论这个程序是不安全的,当有多个程序同时向共享内存中读写数据时,问题就会出现。可能你会认为,可以改变一下written的使用方式,例如,只有当written为0时进程才可以向共享内存写入数据,而当一个进程只有在written不为0时才能对其进行读取,同时把written进行加1操作,读取完后进行减1操作。这就有点像文件锁中的读写锁的功能。咋看之下,它似乎能行得通。但是这都不是原子操作,所以这种做法是行不能的。试想当written为0时,如果有两个进程同时访问共享内存,它们就会发现written为0,于是两个进程都对其进行写操作,显然不行。当written为1时,有两个进程同时对共享内存进行读操作时也是如些,当这两个进程都读取完是,written就变成了-1.要想让程序安全地执行,就要有一种进程同步的进制,保证在进入临界区的操作是原子操作。例如,可以使用前面所讲的信号量来进行进程的同步。因为信号量的操作都是原子性的。五、使用共享内存的优缺点1、优点:我们可以看到使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。同时,它也不像匿名管道那样要求通信的进程有一定的父子关系。2、缺点:共享内存没有提供同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段来进行进程间的同步工作。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1722984次
积分:11039
积分:11039
排名:第1277名
原创:126篇
转载:35篇
评论:723条
阅读:17511
文章:28篇
阅读:1141777
(1)(2)(5)(2)(1)(1)(1)(2)(2)(4)(2)(1)(7)(5)(4)(3)(15)(17)(4)(4)(4)(3)(2)(11)(5)(10)(10)(11)(24)linux 共享内存shm_open实现进程间大数据交互 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 20时,
/* int shm_open(const char *name, int oflag, mode_t mode); //创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。 1.name:共享内存区的名字; 2.标志位;open的标志一样 3.权限位 int shm_unlink(const char *name);
编译时要加库文件-lrt */
代码片段(2)
read.c&~&1KB&&&&
#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&
#include &stdio.h&
#include &sys/mman.h&
#include &string.h&
#include &errno.h&
#include &unistd.h&
int shm_open(const char *name, int oflag, mode_t mode);
//创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。
1.name:共享内存区的名字;
2.标志位;open的标志一样
int shm_unlink(const char *name);
编译时要加库文件-lrt
#define SHMNAME "shm_ram"
#define OPEN_FLAG O_RDWR|O_CREAT
#define OPEN_MODE 00777
#define FILE_SIZE 4096*4
int main(void)
int ret = -1;
int fd = -1;
char buf[4096] = {0};
void* add_r = NULL;
//创建或者打开一个共享内存
fd = shm_open(SHMNAME, OPEN_FLAG, OPEN_MODE);
if(-1 == (ret = fd))
perror("shm
failed: ");
goto _OUT;
//调整确定文件共享内存的空间
ret = ftruncate(fd, FILE_SIZE);
if(-1 == ret)
perror("ftruncate faile: ");
goto _OUT;
//映射目标文件的存储区
add_r = mmap(NULL, FILE_SIZE, PROT_READ, MAP_SHARED, fd, SEEK_SET);
if(NULL == add_r)
perror("mmap add_r failed: ");
goto _OUT;
//memcpy 内存共享 写入内容
memcpy(buf, add_r, sizeof(buf));
printf("buf = %s\n", buf);
//取消映射
ret = munmap(add_r, FILE_SIZE);
if(-1 == ret)
perror("munmap add_r faile: ");
goto _OUT;
//删除内存共享
shm_unlink(SHMNAME);
if(-1 == ret)
perror("shm_unlink faile: ");
goto _OUT;
write.c&~&1KB&&&&
#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&
#include &stdio.h&
#include &sys/mman.h&
#include &string.h&
#include &errno.h&
#include &unistd.h&
int shm_open(const char *name, int oflag, mode_t mode);
//创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。
1.name:共享内存区的名字;
2.标志位;open的标志一样
int shm_unlink(const char *name);
编译时要加库文件-lrt
#define SHMNAME "shm_ram"
#define OPEN_FLAG O_RDWR|O_CREAT
#define OPEN_MODE 00777
#define FILE_SIZE 4096*4
int main(void)
int ret = -1;
int fd = -1;
void* add_w = NULL;
//创建或者打开一个共享内存
fd = shm_open(SHMNAME, OPEN_FLAG, OPEN_MODE);
if(-1 == (ret = fd))
perror("shm
failed: ");
goto _OUT;
//调整确定文件共享内存的空间
ret = ftruncate(fd, FILE_SIZE);
if(-1 == ret)
perror("ftruncate faile: ");
goto _OUT;
//映射目标文件的存储区
add_w = mmap(NULL, FILE_SIZE, PROT_WRITE, MAP_SHARED, fd, SEEK_SET);
if(NULL == add_w)
perror("mmap src failed: ");
goto _OUT;
//memcpy 内存共享 写入内容
memcpy(add_w, "howaylee", sizeof("howaylee"));
//取消映射
ret = munmap(add_w, FILE_SIZE);
if(-1 == ret)
perror("munmap add_w faile: ");
goto _OUT;
//删除内存共享
/*shm_unlink(SHMNAME);
if(-1 == ret)
perror("shm_unlink faile: ");
goto _OUT;
开源中国-程序员在线工具:
为啥不用管道?
2楼:haolifeng 发表于
3楼:Thomas-yang 发表于
牛B,膜拜下
开源从代码分享开始
howaylee的其它代码一步一步学Linux C:共享内存通信实例_Linux编程_Linux公社-Linux系统门户网站
你好,游客
一步一步学Linux C:共享内存通信实例
来源:Linux社区&
作者:muge0913
共享内存是LUNIX 系统中最底层的通信机制,也是最快速的通信机制。共享内存通过两个或多个进程共享同一块内存区域来实现进程间的通信。通常是由一个进程创建一块共享
内存区域,然后多个进程可以对其进行访问,一个进程将要传出的数据存放到共享内存中,另一个或多个进程则直接从共享内存中读取数据。因此这种通信方式是最高效的进程间通信方式。但实际的问题在于,当两个或多个进程使用共享内存进行通信时,同步问题的解决显得尤为重要,否则就会造成因不同进程同时读写一块共享内存中的数据而发生混乱。在通常的情况下,通过使用信号量来实现进程的同步。
以上两个程序是一个进程间通信的例子。这两个程序分别在不同的进程中运行,使用了共享内存进行通信。b从键盘读入数据,存放在共享内存中。a则从共享内存中读取数据,显示到屏幕上。由于没有使两个进程同步,显示的内容将是杂乱无章的,对这一问题的处理将在进一步学习有关同步的操作之后完成。
实例b程序负责向共享内存中写入数据,a程序负责从内存中读出共享的数据,它们之间并没有添加同步操作。
#include&&sys/types.h& &&
#include&&sys/ipc.h& &&
#include&&sys/shm.h& &&
#include&&stdio.h& &&
#define&BUF_SIZE&1024 &&
#define&MYKEY&25 &&
int&main()&&
&&&&int&&&
&&&&char&*&&
&&&&if((shmid&=&shmget(MYKEY,BUF_SIZE,IPC_CREAT))&==-1)&&
&&&&printf("shmget&error&\n");&&
&&&&exit(1);&&
&&&&if((shmptr&=shmat(shmid,0,0))==(void&*)-1)&&
&&&&printf("shmat&error!\n");&&
&&&&exit(1);&&
&&&&while(1)&&
&&&&printf("input:");&&
&&&&scanf("%s",shmptr);&&
&&&&exit(0);&&
#include&&stdio.h& &&
#include&&sys/types.h& &&
#include&&sys/ipc.h& &&
#include&&sys/shm.h& &&
#define&BUF_SIZE&1024 &&
#define&MYKEY&25 &&
int&&main()&&
&&&&int&&&
&&&&char&*&&&
&&&&if((shmid&=&shmget(MYKEY,BUF_SIZE,IPC_CREAT))&==-1)&&
&&&&printf("shmget&error!\n");&&
&&&&exit(1);&&
&&&&if((shmptr&=&shmat(shmid,0,0))&==&(void&*)-1)&&
&&&&printf("shmat&error!\n");&&
&&&&exit(1);&&
&&&&while(1)&&
&&&&printf("string&:%s\n",shmptr);&&
&&&&sleep(3);&&
&&&&exit(0);&&
相关资讯 & & &
& (02月09日)
& (08/04/:48)
& (03月05日)
& (08/05/:15)
& (04/11/:44)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款&Linux共享内存实例及文件映射编程及实现原理
秒后自动跳转到登录页
快捷登录:
举报类型:
不规范:上传重复资源
不规范:标题与实际内容不符
不规范:资源无法下载或使用
其他不规范行为
违规:资源涉及侵权
违规:含有危害国家安全等内容
违规:含有反动/色情等内容
违规:广告内容
详细原因:
任何违反下载中心规定的资源,欢迎Down友监督举报,第一举报人可获5-10下载豆奖励。
视频课程推荐
Linux共享内存实例及文件映射编程及实现原理
上传时间:
技术分类:
资源评价:
(0位用户参与评价)
已被下载&1&次
文件映射的页框是磁盘文件高速缓存中的页框,内核线程pdflush会将页框中的内容回写进磁盘, 如果是私有映射类型,将会进行写时复制。而IPC共享内存映射的是一种特殊文件系统中的文件高速缓存,它没有相应的磁盘映像。
本资料共包含以下附件:
Linux共享内存实例及文件映射编程及实现原理.rtf
51CTO下载中心常见问题:
1.如何获得下载豆?
1)上传资料
2)评论资料
3)每天在首页签到领取
4)购买VIP会员服务,无需下载豆下载资源
5)更多途径:点击此处
2.如何删除自己的资料?
下载资料意味着您已同意遵守以下协议:
1.资料的所有权益归上传用户所有
2.未经权益所有人同意,不得将资料中的内容挪作商业或盈利用途
3.51CTO下载中心仅提供资料交流平台,并不对任何资料负责
4.本站资料中如有侵权或不适当内容,请邮件与我们联系()
5.本站不保证资源的准确性、安全性和完整性, 同时也不承担用户因使用这些资料对自己和他人造成任何形式的伤害或损失
相关专题推荐
《Linux 运维趋势》是由 51CTO 系统频
Windows Server 2003系列沿用了2000的
域(Domain)是Windows网络中独立运行的
马哥教育是从事Linux运维、系统、架构
本视频详细介绍了linux主机管理,从l
本专题为Windows Server 2008 R2从入
《鸟哥的Linux私房菜》是最具知名度的
本专题为YesLab讲师赵小明讲解的Linu
本专题是一套很系统很全面的高端集群
本套教程为华中红客基地DOS命令讲解系
本系列视频为郑州拓远教育咨询有限公
本专题为尚观发布的shell脚本编程视频
课程旨在对生产环境的工作任务进行详
韦东山老师的《嵌入式Linux应用开发完
本专题为Linux高级进阶教程,内容涉及
本套Linux视频教程,于3月1日开始陆续
意见或建议:
联系方式:
您已提交成功!感谢您的宝贵意见,我们会尽快处理linux实现共享内存同步的四种方法
本文主要对实现共享内存同步的四种方法进行了介绍。
共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。它是IPC对象的一种。
为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。
同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情。由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等
信号灯(semaphore),也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制。信号灯包括posix有名信号灯、
posix基于内存的信号灯(无名信号灯)和System V信号灯(IPC对象)
方法一、利用POSIX有名信号灯实现共享内存的同步
有名信号量既可用于线程间的同步,又可用于进程间的同步。
两个进程,对同一个共享内存读写,可利用有名信号量来进行同步。一个进程写,另一个进程读,利用两个有名信号量semr,
semw。semr信号量控制能否读,初始化为0。 semw信号量控制能否写,初始为1。
读共享内存的程序示例代码如下
sem_open("mysem_r", O_CREAT | O_RDWR , 0666, 0);
&&&&&&&&if
(semr == SEM_FAILED)
&&&&&&&&&&&&&&&&printf("errno=%d\n",
&&&&&&&&&&&&&&&&return
&&&&&&&&semw
= sem_open("mysem_w", O_CREAT | O_RDWR, 0666, 1);
&&&&&&&&if
(semw == SEM_FAILED)
&&&&&&&&&&&&&&&&printf("errno=%d\n",
&&&&&&&&&&&&&&&&return
&&&&&&&&if
((shmid = shmget(key, MAXSIZE, 0666 | IPC_CREAT)) == -1)
&&&&&&&&&&&&&&&&perror("semget");
&&&&&&&&&&&&&&&&exit(-1);
&&&&&&&&if
((shmadd = (char *)shmat(shmid, NULL, 0)) == (char *)(-1))
&&&&&&&&&&&&&&&&perror("shmat");
&&&&&&&&&&&&&&&&exit(-1);
&&&&&&&&while
&&&&&&&&&&&&&&&&em_wait(semr);
&&&&&&&&&&&&&&&&printf("%s\n",
&&&&&&&&&&&&&&&&sem_post(semw);
写共享内存的程序示例代码如下
。。。。。。
&&&&&&&&//同读的程序
&&&&&&&&while
&&&&&&&&&&&&&&&&sem_wait(semw);
&&&&&&&&&&&&&&&&printf("&");
&&&&&&&&&&&&&&&&fgets(shmadd,
MAXSIZE, stdin);
&&&&&&&&&&&&&&&&sem_post(semr);
方法二、利用POSIX无名信号灯实现共享内存的同步
POSIX无名信号量是基于内存的信号量,可以用于线程间同步也可以用于进程间同步。若实现进程间同步,需要在共享内存中来创建无名信号量。
因此,共享内存需要定义以下的结构体。
&&&&&&&&&&&&&&&&sem_t
&&&&&&&&&&&&&&&&sem_t
&&&&&&&&&&&&&&&&char
buf[MAXSIZE];
&&&&&&&&}SHM;
读、写程序流程如下图所示。
方法三、利用System V的信号灯实现共享内存的同步
V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯
System V 信号灯由内核维护,主要函数semget,semop,semctl 。
一个进程写,另一个进程读,信号灯集中有两个信号灯,下标0代表能否读,初始化为0。
下标1代表能否写,初始为1。
程序流程如下:
写的流程和前边的类似。
方法四、利用信号实现共享内存的同步
信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。利用信号也可以实现共享内存的同步。
reader和writer通过信号通信必须获取对方的进程号,可利用共享内存保存双方的进程号。
reader和writer运行的顺序不确定,可约定先运行的进程创建共享内存并初始化。
利用pause, kill, signal等函数可以实现该程序(流程和前边类似)。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 nfs实现linux目录共享 的文章

 

随机推荐