linux进程间的通信之 共享内存

#include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shm_id, const void *shm_addr, int shmflg);
int shmdt(const void *shm_addr);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shm_id, const void *shm_addr, int shmflg);
int shmdt(const void *shm_addr);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
shmid_ds结构至少包含以下成员:
struct shmid_ds {
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
}
shm_com.h
#define TEXT_SZ 2048 struct shared_use_st {
int written_by_you;
char some_text[TEXT_SZ];
};
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h> #include <sys/shm.h> #include "shm_com.h"
int main()
{
int running = ;
void *shared_memory = (void *);
struct shared_use_st *shared_stuff;
int shmid; srand((unsigned int)getpid());
shmid = shmget((key_t), sizeof(struct shared_use_st), | IPC_CREAT); if (shmid == -) {
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
}
现在,让程序可以访问这个共享内存:
shared_memory = shmat(shmid, (void *), ); if (shared_memory == (void *)-) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
} printf("Memory attached at %X\n", (int)shared_memory);
shared_stuff = (struct shared_use_st *)shared_memory;
shared_stuff->written_by_you = ; while(running)
{
if (shared_stuff->written_by_you)
{
printf("You wrote: %s", shared_stuff->some_text); sleep( rand() % ); /* make the other process wait for us ! */
shared_stuff->written_by_you = ; if (strncmp(shared_stuff->some_text, “end”, ) == ) {
running = ;
}
}
}
最后,共享内存被分离,然后被删除:
if (shmdt(shared_memory) == -)
{
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
} if (shmctl(shmid, IPC_RMID, ) == -)
{
fprintf(stderr, "shmctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
} exit(EXIT_SUCCESS);
}
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h> #include <sys/shm.h> #include "shm_com.h" int main()
{
int running = ;
void *shared_memory = (void *);
struct shared_use_st *shared_stuff;
char buffer[BUFSIZ];
int shmid; shmid = shmget((key_t), sizeof(struct shared_use_st), | IPC_CREAT);
if (shmid == -)
{
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
} shared_memory = shmat(shmid, (void *), );
if (shared_memory == (void *)-)
{
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
} printf("Memory attached at %X\n", (int)shared_memory); shared_stuff = (struct shared_use_st *)shared_memory;
while(running)
{
while(shared_stuff->written_by_you == )
{
sleep();
printf("waiting for client...\n");
}
printf("Enter some text: ");
fgets(buffer, BUFSIZ, stdin); strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
shared_stuff->written_by_you = ; if (strncmp(buffer, "end", ) == ) {
running = ;
}
} if (shmdt(shared_memory) == -) {
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
} exit(EXIT_SUCCESS);
}
$ ./shm1 &
[]
Memory attached at
$ ./shm2
Memory attached at
Enter some text: hello
You wrote: hello
waiting for client...
waiting for client...
Enter some text:
You wrote:
waiting for client...
waiting for client...
waiting for client...
Enter some text: end
You wrote: end
$
linux进程间的通信之 共享内存的更多相关文章
- Linux进程间的通信
一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟 ...
- PHP与Linux进程间的通信
进程间通信预计是公司考察应届毕业生的必考点(嵌入式行业).当然非常多公司考的是算法. 不查阅资料,我脑子里能想到的 [1] 管道, (有名.无名) [2] 父子进程 [3] System V (消息队 ...
- Linux进程IPC浅析[进程间通信SystemV共享内存]
Linux进程IPC浅析[进程间通信SystemV共享内存] 共享内存概念,概述 共享内存的相关函数 共享内存概念,概述: 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到 ...
- [转]WINDOW进程间数据通讯以及共享内存
1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...
- linux进程间的通信方式
linux进程间的通信 进程间的通信就是不同的进程之间传播或交换信息,进程的用户空间是互相独立,进程之间可以利用系统空间交换信息. 管道 允许将一个进程的标准输出和另一个进程的标准输入连接在一起,主要 ...
- linux 进程通信之 共享内存
共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法.一个进程向共享内存区域写入了数据,共享这个内存区域的全部进程就能够立马看到当中的内容. 关于共享内存使用的API k ...
- Windows中利用共享内存来实现不同进程间的通信
Windows中利用共享内存来实现不同进程间的通信 一.msdn详细介绍 https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-f ...
- Nginx之进程间的通信机制(共享内存、原子操作)
1. 概述 Linux 提供了多种进程间传递消息的方式,如共享内存.套接字.管道.消息队列.信号等,而 Nginx 框架使用了 3 种传递消息的传递方式:共享内存.套接字.信号. 在进程间访问共享资源 ...
- Linux 进程通信(共享内存区)
共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段). 如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中. 如果一个进程更新了段中的数据,其他进程也 ...
随机推荐
- 批量更改某一目录之下所有文件名 Ver2
前一篇<批量更改某一目录之下所有文件名>只是批量修改所有子目录下的文件名.Insus.NET重构了它.能让它修改所有子目录名和子目录下的文件名.就是分别迭代,目录迭代目录,文件迭代文件. ...
- javascript 获取标签内的内容
js 获取标签内的内容 参考:这篇博客给了我很大的启发. http://www.cnblogs.com/breakdown/archive/2012/10/09/2716221.html 我遇到的问题 ...
- gRPC官方文档(概念)
文章来自gRPC 官方文档中文版 gRPC 概念 本文档通过对于 gRPC 的架构和 RPC 生命周期的概览来介绍 gRPC 的主要概念.本文是在假设你已经读过文档部分的前提下展开的.针对具体语言细节 ...
- UINavigationController + UIScrollView组合,视图尺寸的设置探秘(一)
UINavigationController和UIScrollView是iOS下几种主要的交互元素,但当我搭配二者在一起时,UIScrollView的滚动区域出现了很诡异的现象.我希望UIScroll ...
- SpringAOP使用
AspectJ 注解: 1.@Aspect.@Pointcut.Advice @Aspect @Component public class SecurityAspect { @Autowired A ...
- 洛谷P3258 [JLOI2014]松鼠的新家(树上差分+树剖)
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...
- Node JS爬虫:爬取瀑布流网页高清图
原文链接:Node JS爬虫:爬取瀑布流网页高清图 静态为主的网页往往用get方法就能获取页面所有内容.动态网页即异步请求数据的网页则需要用浏览器加载完成后再进行抓取.本文介绍了如何连续爬取瀑布流网页 ...
- Index Filter及ICP特性
原文链接:http://hedengcheng.com/?p=577 (一)问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生 ...
- DP【洛谷P2295】 MICE
P2295 MICE S国的动物园是一个N*M的网格图,左上角的坐标是(1,1),右下角的坐标是(N,M). 小象在动物园的左上角,它想回到右下角的家里去睡觉,但是动物园中有一些老鼠,而小象又很害怕老 ...
- SIGHUP信号
SIGHUP会在以下3种情况下被发送给相应的进程:1.终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)2.session首进程退出时,该信号被 ...