SystemV 和Posix两种方式实现共享内存

正如实现信号量的方式有SystemV 和Posix两种形式,

实现共享内存也有SystemV 和Posix两种形式,参考该文该文 和该文

一、Posix形式:(常用)

i5ed9e9214667ae25630841972e8359bf.png

用到如下函数:

shm_open
mmap
ftruncate
shm_unlink

二、System V 形式:

参考该文。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define  MEMSIZE 1024
 
int main()
{
    //ftok();//有血缘关系的进程,我们不关心key值,可以不用,使用匿名IPC。即shmget中使用IPC_PRIVATE
 
    char *ptr = NULL;
    shmid = shmget(IPC_PRIVATE,MEMSIZE,0600);
    if(shmid<0)
    {
        perror("shmget()");
        exit(1);
    }
    pid = fork();
    if(pid<0)
    {
        perror("fork()");
        exit(1);
    }
    if(pid == 0) //子进程
    {
        ptr = shmat(shmid,NULL0);
        if(ptr = (void*)-1)
        {
              perror("shmat()");
              exit(1);
        }
        strcpy(ptr,"hello");
        shmdt(ptr);//子进程解除映射
        exit(0);
            
    }
    else  //父进程
    {
        wait(NULL);//收尸,因为没有用到阻塞的系统调用,放在这能确保子进程写完。
        ptr = shmat(shmid,NULL,0);
        if(ptr== (void*)-1)
        {
            perror("shmat");
            exit(1);
        }
        puts(ptr);
        shmdt(ptr);
        shmctl(shmid,IPC_RMID,NULL);//因为是销毁,故第3个参数为NULL
        exit(0);
    }

用到如下函数:

shm_get()
shm_at();
shm_dt();
shm_ctl();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值