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();

猜你喜欢

转载自blog.csdn.net/modi000/article/details/125040721