良许Linux教程网 干货合集 Linux实现共享内存同步具体方法

Linux实现共享内存同步具体方法

Linux下如何实现内存共享?共享内存进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,下面良许教程网为大家分享一下Linux下内存共享具体方法。

linux实现共享内存同步具体方法

方法一、利用POSIX有名信号灯实现共享内存的同步

有名信号量既可用于线程间的同步,又可用于进程间的同步。

两个进程,对同一个共享内存读写,可利用有名信号量来进行同步。一个进程写,另一个进程读,利用两个有名信号量semr, semw。semr信号量控制能否读,初始化为0。 semw信号量控制能否写,初始为1。

读共享内存的程序示例代码如下

 semr = sem_open("mysem_r", O_CREAT | O_RDWR , 0666, 0);
     if (semr == SEM_FAILED)
     {
         printf("errno=%d\n", errno);
         return -1;
     }
 
 •    semw = sem_open("mysem_w", O_CREAT | O_RDWR, 0666, 1);
 •    if (semw == SEM_FAILED)
 •    {
 •        printf("errno=%d\n", errno);
 •        return -1;
 •    }
 
 •    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 (1)
 •    {
 •        em_wait(semr);
 •        printf("%s\n", shmadd);
 •        sem_post(semw);
 •    }
 
 写共享内存的程序示例代码如下
 
 。。。。。。
     //同读的程序
     while (1)
     {
         sem_wait(semw);
         printf(">");
         fgets(shmadd, MAXSIZE, stdin);
         sem_post(semr);
     }

方法二、利用POSIX无名信号灯实现共享内存的同步

POSIX无名信号量是基于内存的信号量,可以用于线程间同步也可以用于进程间同步。若实现进程间同步,需要在共享内存中来创建无名信号量。

因此,共享内存需要定义以下的结构体。

 typedef struct
     {
         sem_t semr;
         sem_t semw;
         char buf[MAXSIZE];
     }SHM;

读、写程序流程如下图所示。

img

img

方法三、利用System V的信号灯实现共享内存的同步

System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯

System V 信号灯由内核维护,主要函数semget,semop,semctl 。

一个进程写,另一个进程读,信号灯集中有两个信号灯,下标0代表能否读,初始化为0。 下标1代表能否写,初始为1。

程序流程如下:

img

写的流程和前边的类似。

方法四、利用信号实现共享内存的同步

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。利用信号也可以实现共享内存的同步。

思路:

reader和writer通过信号通信必须获取对方的进程号,可利用共享内存保存双方的进程号。

reader和writer运行的顺序不确定,可约定先运行的进程创建共享内存并初始化。

利用pause, kill, signal等函数可以实现该程序(流程和前边类似)。

总结

至此关于Linux下内存共享的教程分享结束,大家如果对内存共享还有相关疑问可以通过评论区将问题提交给我们。

以上就是良许教程网为各位朋友分享的Linux系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你!

137e00002230ad9f26e78-265x300

本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部