Linux shared Memory的写入与读取
2017-06-01 23:18
465 查看
作用
多个进程就可以访问相同的物理存储,以此实现多进程通信。特点
提供了进程间共享数据的最快途径不在读写数据之间提供任何同步方法
常用的函数
shmget函数用于创建/打开一个共享存储段int shmget(key_t key, size_t size, int shmflg);
调用shmat函数来连接这个共享段到自己的地址空间
void *shmat(int shmid, void *shmaddr, int shmflg);
使用shmdt函数将它从进程地址空间分离
int shmdt(void *shmaddr);
写入与读取操作:
服务程序和客户程序共享一个存储段,服务程序创建共享存储段并写入信息等待回馈,客户程序接收信息并重写共享存储段并分离,服务程序接收客户发的信息并退出。server.c
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
void main(){
char c[18] = "Hello, I am server";
int shmid;
key_t key = 56789;
char *shm, *s;
shmid = shmget(key, 20, IPC_CREAT|0666);//创建并赋权限(所有用户都可读写)
if( shmid == -1){
printf("Error: create shared Memory");
exit(0);
}
shm = shmat(shmid, NULL, 0);
if( shm == -1){
printf("Error: connect shared Memory");
exit(0);
}
s = shm;
for(int i=0; i<18; i++){
*s = c[i];
s++;
}
*s = NULL;
while(*shm != '*'){
printf("Waiting...\nThe shared Memory is :");
for(s = shm; *s != NULL; s++){
if(*s =='*'){
putchar('\n');
exit(0);
}
putchar( *s );
}
sleep(1);
putchar('\n');
}
}
client.c
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
void main(){
int shmid;
char c[15] = "Hi, I am client";
key_t key = 56789;
char *shm, *s;
shmid = shmget(key, 0, 0666);
if( shmid == -1){
printf("Error: create shared Memory");
exit(0);
}
shm = shmat(shmid, NULL, 0);
if( shm == -1){
printf("Error: connect shared Memory");
exit(0);
}
for(s = shm; *s != NULL; s++){
putchar( *s );
}
putchar('\n');
for(int i=0; i<16; i++){
if( i == 15){
*shm = '*';
}else{
*shm = c[i];
shm++;
}
}
shmdt( shm );//分离共享存储段
exit(0);
}运行步骤:
gcc server.c -o server
gcc client.c -o client
./server
重开一个命令行
./client
相关文章推荐
- Linux Kernel Shared Memory 剖析
- How to list processes attached to a shared memory segment in linux?
- ORA-27125: unable to create shared memory segment Linux-x86_64 Error: 1: Operation not per
- Oracle因开启大页内存无法启动ORA-27100: shared memory realm already exists Linux-x86_64 Error: 17: File exists
- Linux-004-解决 Tomcat 启动时提示 Insufficient space for shared memory file
- Linux下C语言实现的简单使用线程向FIFO里写入与读取数据的例子
- Shared memory on Linux(difference posix and systemv )
- linux dd 读取 写入磁盘速度
- 有没有人能帮我解释哈,linux下写perl时怎么读取、写入中文字符呀?急求
- 简单文件操作(Linux下C++实现) 打开,读取 写入 关闭
- linux ipc——shared memory
- 在Linux DeviceTree增添dtsi文件并在驱动中读取节点信息写入sys文件系统
- 2014-7-22 Android SharedPreferences 写入与读取数据
- Linux下MySQL数据库无法只能读取无法写入
- Linux Kernel Shared Memory 剖析
- ORA-27125: unable to create shared memory segment Linux-x86_64 Error: 1: Operation not permitted
- linux posix shared memory: bus error
- ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux Error: 2: No suc
- 在Linux DeviceTree增添dtsi文件并在驱动中读取节点信息写入sys文件系统
- Linux内存管理: Linux Kernel Shared Memory 剖析 Linux 内核中的内存去耦合