美文网首页
XSI IPC之共享内存 (1)

XSI IPC之共享内存 (1)

作者: 静倚晴窗笑此生 | 来源:发表于2019-03-28 19:27 被阅读0次

有两种方法创建共享内存,第一种用shmop提供的函数,第二种通过mmap(2)函数

man shmop 查看共享内存操作函数

shmget( )

获得一个共享存储标识符

函数声明

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

参数含义

第一个参数为ftok(3)函数返回值,如果 key值为 IPC_PRIVATE 则只能用于有亲缘关系

第二个参数为共享内存空间的大小

第三个参数可选(多选用或运算)

IPC_CREAT 创建,需要或上文件权限

IPC_EXCLIPC_CREAT一起使用,确保如果消息队列已经创建,则返回失败

返回值

成功返回 共享内存示例

失败返回 -1 并且设置errno 如果标识符使用了IPC_CREATIPC_EXCL 并且errno的值为EEXIST,代表消息队列已经存在

shmat()

挂载共享内存,将共享内存连接到进程的可用地址上

函数声明

#include <sys/types.h>
#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

参数含义

第一个参数为共享内存示例

第二个参数如果是NULL,则内核自动分配到进程所在的第一个可用地址上,不传NULL,则分配地址由用户指定;

返回值

成功返回共享内存地址,失败返回-1,设置errno值

shmdt()

卸载共享内存,将共享内存从进程的可用地址上删除

函数声明

#include <sys/types.h>
#include <sys/shm.h>

int shmdt(const void *shmaddr);

参数含义

shmaddr为shmdt函数的返回值

shmctl()

移除共享内存

函数声明

#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

共享内存示例1

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main(void)
{
    pid_t pid;
    int shmid;
    int flag = 1;

    shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | IPC_EXCL | 0600);
    if (shmid < 0) {
        if (errno == EEXIST) {
            shmid = shmget(IPC_PRIVATE, 1024, 0);
            flag = 0;
        } else {
            perror("shmid()");
            exit(1);
        }
    }

    pid = fork();
    if (pid < 0) {
        perror("fork()");
        goto FORK_ERROR;
    }

    if (pid == 0) {
        void *p = shmat(shmid, NULL, 0);    
        memcpy(p, "hello world", 11);
        shmdt(p);
        exit(1);
    }

    wait(NULL);
    void *ptr = shmat(shmid, NULL, 0);
    puts((char *)ptr);
    shmdt(ptr);

    if (flag)
        shmctl(shmid, IPC_RMID, NULL);
    exit(0);
FORK_ERROR:
    if (flag)
        shmctl(shmid, IPC_RMID, NULL);
    exit(1);
}

相关文章

  • Linux共享内存

    这里介绍Linux下常见的共享内存技术。 1、 Linux XSI 的 IPC 下的共享内存机制 Linux XS...

  • XSI IPC之共享内存 (1)

    有两种方法创建共享内存,第一种用shmop提供的函数,第二种通过mmap(2)函数man shmop 查看共享内存...

  • linux -11-IPC(共享内存和消息队列)

    XSI IPC之共享内存 和 消息队列(有固定的套路) 共享内存/消息队列/信号量集 遵循相同的规范,因此编程上有...

  • XSI IPC之共享内存 (2)

    映射地址空间,只能用与有亲缘关系 函数声明 参数含义 第一参数为映射空间地址,如果是NULL,则内核自动分配到进程...

  • APUE读书笔记-15进程内部通信(5)

    6、XSIIPC 三种类型的XSI IPC:消息队列,信号量,和共享内存,有许多共同点。这里将讨论这些共同的特性,...

  • 第2章 IPC机制

    2.1 Android IPC简介 Linux的IPC通信机制:命名通道、共享内存、信号量等来进行IPC。 And...

  • 41|共享内存(中)

    image.png使用共享内存流程如下: 调用 shmget 创建共享内存。 先通过 ipc_findkey 在基...

  • 进程间通信(5)-IPC通信

    IPC通信(Inter-Process Communication) 三种IPC对象: 共享内存、消息队列、信号灯...

  • 8.14

    进程间通信(IPC)实现方式共享内存:共享的内存间没有同步机制,需要进程协商解决;减少了数据的复制,速度更快 1...

  • 共享内存数据库--设计及实现

    共享内存: 共享内存是三种IPC机制中的一种.共享享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个...

网友评论

      本文标题:XSI IPC之共享内存 (1)

      本文链接:https://www.haomeiwen.com/subject/bdwcbqtx.html