IPC之共享内存(3)

1、共享内存

共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存写入一段数据,共享这个区域的所有进程就能立刻共享其中的内容。

这里写图片描述


2、共享内存实现

(1)创建共享内存,使用shmget函数。

#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);

key:当 key 取值为 IPC_PRIVATE时,则函数shmget()
将创建一段新的共享内存;如果 key 取值为0,而参数 shmflg 被设置为 IPC_PRIVATE 这个标志,则同样会创建一段新的共享内存。
返回值:如果成功,则返回共享内存标识符;否则返回-1.

(2)映射共享内存,将这段创建的共享内存映射到具体的进程里空间去,使用shmat函数。

#include <sys/shm.h>
void *shmat(int shmid, const void *addr, int flag);

shmid:shmget 返回的的共享内存标志符;
flag:决定以什么方式来确定映射的地址(通常为0)

返回值:如果成功,则返回共享内存映射到进程的地址,否则返回-1。

(3)共享内存解除。

#include <sys/shm.h>
int shmdt(char *shmaddr);

当一个进程不在需要共享内存时,需要把它从进程地址空间中脱离。

3、父、子进程共享内存

demo:

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

#define SHMFLG (S_IRUSR | S_IWUSR)

int main(int argc, char *argv[])
{
    int shmid;
    pid_t pid;
    char *p_addr;
    char *c_addr;
    int i;

    if (argc == 1){
        fprintf(stderr, "Usage : %s [data...]\n", argv[0]);
        exit(1);
    }

    /* 创建共享内存 */
    if ((shmid = shmget(IPC_PRIVATE, 1024, SHMFLG)) == -1){
        fprintf(stderr, "Create share memory error : %s\n\a", strerror(errno));
        exit(1);
    }

    /* 创建子进程 */
    if ((pid = fork()) < 0){
        fprintf(stderr, "fork error\n");
        exit(1);
    }
    else if (pid > 0){              // 父进程想共享内存写数据
        printf("Parent process writing data to share memory...\n");
        p_addr = shmat(shmid, 0, 0);
        memset(p_addr, '\0', 1024);
        for (i = 1; i < argc; i++){
            strcat(p_addr, " ");
            strcat(p_addr, argv[i]);
        }
        waitpid(pid, NULL, 0);
        exit(0);
    }
    else{                           // 子进程从共享内存读数据
        sleep(1);                   // 让父进程有足够的时间写数据
        c_addr = shmat(shmid, 0, 0);
        fprintf(stdout, "Child process reading data form share memory...%s\n", c_addr);
        exit(0);
    }

    exit(0);
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值