`

C语言进程间通信(四)——共享内存

 
阅读更多

共享内存通信方式效率最高,毕竟是直接操作内存,但是要保证多个进程对同一块内存访问的同步互斥比较麻烦,借助信号量实现

对每个共享存储段,内核维护一个shmid_ds类型的结构体,定义在<sys/shm.h>文件中

struct shmid_ds
{
struct ipc_perm shm_perm;	//共享内存的ipc_perm结构
size_t shm_segsz;	//共享内存区域大小,字节表示
pid_t shm_lpid;	//最后一次调用shmop函数的进程ID
pid_t shm_cpid;	//创建此共享内存的进程ID
unsigned short shm_lkcnt;	//共享内存被锁定的时间数
unsigned long shm_nattch;	//当前使用共享内存的进程数
time_t shm_atime;	//最后一次附加操作时间
time_t shm_dtime;	//最后一次分离操作时间
time_t shm_ctime;	//最后一次修改时间
}

共享内存基本操作

1,创建或打开一个共享内存(shmget)

//create_shm.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>

#define BUFSZ 1024

int main()
{
        int shm_id;     //共享内存ID
        shm_id = shmget(IPC_PRIVATE,BUFSZ,0666);
        if(shm_id < 0){
                printf("shmget failed\n");
                return -1;
        }
        printf("create shared memory succeed: %d\n",shm_id);
        system("ipcs -m"); //查看共享内存ID
        return 0;
}

2,附加共享内存到进程空间(shmat/shmdt)

//attach_shm.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>

#define BUFSZ 1024

int main()
{
        int *shm;
        shm = shmat(104529925,NULL,0);
        if(*shm == -1){
                printf("shmat failed\n");
                return -1;
        }
        printf("attach shared memory succeed: %d\n",*shm);
        system("ipcs -m"); //查看共享内存调用状态 
        if(shmdt(shm) == -1){
                printf("shmdt failed\n");
                return -1;
        }
        system("ipcs -m"); //查看共享内存调用状态 
        return 0;
}

3,共享内存控制函数(shmctl)

 

下面写个简单的例子

共享内存写端(write_shm.c)

//write_shm.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>

typedef struct
{
        char name[4];
        int age;
}people;

int main()
{
        int i;
        char *t = 'a';
        people *p_shm = NULL;
        p_shm = shmat(104529925,NULL,0);
        if(p_shm == NULL){
                printf("shmat failed\n");
                return -1;
        }
        for(i=0;i<5;i++) {
                t += 1;
                memcpy((*(p_shm+i)).name,&t,1);
                (*(p_shm+i)).age = 20+i;
        }
        if(shmdt(p_shm) == -1){
                printf("shmdt failed\n");
                return -1;
        }
        return 0;
}

共享内存读端(read_shm.c)

//read_shm.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>

typedef struct
{
        char name[4];
        int age;
}people;

int main()
{
        int i;
        char *t = 'a';
        people *p_shm = NULL;
        p_shm = shmat(104529925,NULL,0);
        if(p_shm == NULL){
                printf("shmat failed\n");
                return -1;
        }
        for(i=0;i<5;i++) {
                printf("name:%s age:%d\n",(*(p_shm+i)).name,(*(p_shm+i)).age);
        }
        if(shmdt(p_shm) == -1){
                printf("shmdt failed\n");
                return -1;
        }
        return 0;
}

先后编译执行"写代码"与"读代码",结果如下

root$ ./write_shm.out 
root$ ./read_shm.out 
name:b age:20
name:c age:21
name:d age:22
name:e age:23
name:f age:24
分享到:
评论

相关推荐

    进程间通信之消息队列 ( message queue )——完整代码

    进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....

    Linux下C语言编程——进程通信

    System V消息队列是另一种进程间通信方式,允许进程将数据结构(消息)发送到队列,由其他进程接收。相关函数有: - `msgget()`:创建或获取消息队列,指定键值和权限标志。 - `msgsnd()`:向消息队列发送消息。 - ...

    Linux多线程编程知识点总结(C语言)(csdn)————程序.pdf

    进程之间是独立的,拥有各自的内存空间,而线程共享进程的内存,这使得线程间通信更为便捷。创建或撤销线程相比进程更为轻量级,因为线程无需分配和回收资源。 使用多线程的优势主要体现在以下几个方面: 1) 数据...

    Linux下C语言编程--进程通信、消息管理

    共享内存是一种高效的进程间通信机制,它允许多个进程直接访问同一块内存区域。主要API包括: - `shmget(key_t key, size_t size, int shmflg);`:创建或获取共享内存段。 - `shmat(int shmid, void *shmaddr, int ...

    C语言也能干大事——全集下载地址

    进程间通信(IPC)是多进程环境下必不可少的技术之一。这部分可能介绍了管道、信号量、共享内存等IPC机制。 #### 高级算法 在算法基础之上,这部分内容可能会进一步探讨更复杂的数据处理技术,例如图论算法(如...

    5操作系统实验报告-基于共享内存的进程通信

    1. **共享内存的概念**:共享内存是一种允许不同进程访问同一块内存区域的技术,提高了进程间通信的速度。 2. **Linux系统调用**:如`shmget`和`shmat`,它们分别用于创建和附加共享内存。 3. **进程同步机制**:...

    基于C语言多进程通信的银行ATM系统,分为客户端和服务器端。.zip

    通过理解和掌握这个项目,我们可以深入理解C语言的多进程编程以及进程间通信的机制。 首先,我们要了解C语言在多进程编程中的基本概念。C语言提供了创建、管理进程的系统调用,如`fork()`用于创建子进程,`exec()`...

    实验一-进程通信——管道和信号实验报告.doc

    - **进程间通信(IPC)**:进程之间传递数据的方式,包括管道、信号量、共享内存等。 - **Unix系统编程基础**:熟悉C语言编程、shell命令行操作等。 #### 实验方法 本实验采用Unix系统提供的API进行编程,实现进程...

    操作系统 进程通信

    ### 操作系统中的进程通信...通过本次实验,不仅可以掌握进程创建的基本方法,还能深入了解两种常见的进程间通信机制——共享内存和消息队列的工作原理及其应用。这对于进一步学习操作系统理论和实践都是极为有益的。

    Linux环境进程间通信.doc

    Linux环境下的进程间通信(IPC)是操作系统中的一个重要概念,主要涉及如何使多个进程能够共享信息或协同工作。本文档将深入探讨Linux环境下进程间通信的一种常见方式——管道(Pipe),并详细介绍其概念、特点、...

    linux高级应用

    本文详细介绍了Linux环境下的高级应用——共享内存与消息队列的概念、特点以及实现方法。共享内存作为一种快速、灵活的进程间通信方式,在多进程数据共享场景下具有显著的优势。消息队列则是适合于小规模数据有序...

    linux下进程间通信--消息队列

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间共享数据、交换信息的关键技术。其中,消息队列是一种高效且灵活的IPC机制,它允许进程将固定大小的消息发送到一个公共队列,其他...

    LINUX进程间通信:PIPE与FIFO - 山 人 - 博客园1

    ### LINUX进程间通信:PIPE与FIFO #### 概述 在Linux系统中,进程间的通信(IPC)是一项重要的功能,使得不同的进程能够共享或交换数据。本文将深入探讨两种基本且广泛使用的IPC机制——**PIPE**(管道)与**FIFO*...

    吉林大学操作系统实验报告.docx

    实验的第二部分涉及到了POSIX进程间通信,具体是共享内存。共享内存允许两个或更多的进程访问同一块内存区域,从而实现数据的快速交换。在这个实验中,首先使用`shm_open()`创建了一个命名的共享内存对象,并设置了...

    Linux下C语言中的多进程编程资料

    通常用于临时性的进程间通信。 ##### 2. 信号量 信号量是一种可以多进程共享的变量,用于解决进程间的同步问题,防止数据访问冲突。 ##### 3. 共享内存 共享内存使得多个进程可以访问同一块内存区域,是最快的...

    linux进程及进程间通讯

    在深入探讨进程间通信之前,我们先了解一下进程的基础概念。 **进程定义**:进程是计算机中已运行程序的实例,是系统进行资源分配和调度的基本单位。每个进程都有一个唯一的进程标识号(PID),并且可以拥有独立的...

    NIX平台下C语言高级编程

    最后,进程间通信(IPC)在NIX平台上的C语言编程中占据重要地位,包括管道(pipe)、消息队列、共享内存、信号量和套接字等。这些机制允许不同进程之间交换数据,实现协同工作。 综上所述,NIX平台下的C语言高级...

    操作系统实验源码.zip

    共享内存是一种高效的进程间通信方式。实验会介绍如何使用`shmget()`, `shmat()`, `shmdt()`, `shmctl()`等函数创建、连接、断开和控制共享内存区域,以及如何在不同进程中访问和修改共享数据。 通过以上七个实验...

Global site tag (gtag.js) - Google Analytics