良许教程网为大家分享一下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;
读、写程序流程如下图所示。
方法三、利用System V的信号灯实现共享内存的同步
System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯
System V 信号灯由内核维护,主要函数semget,semop,semctl 。
一个进程写,另一个进程读,信号灯集中有两个信号灯,下标0代表能否读,初始化为0。 下标1代表能否写,初始为1。
程序流程如下:
写的流程和前边的类似。
方法四、利用信号实现共享内存的同步
信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。利用信号也可以实现共享内存的同步。
思路:
reader和writer通过信号通信必须获取对方的进程号,可利用共享内存保存双方的进程号。
reader和writer运行的顺序不确定,可约定先运行的进程创建共享内存并初始化。
利用pause, kill, signal等函数可以实现该程序(流程和前边类似)。
总结
以上就是
为各位朋友分享的 相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多 等着你!