← 返回首页
Linux高级程序设计(六十七)
发表时间:2021-12-20 23:53:30
共享内存读写

1.共享内存读写操作

实例:

创建两个进程,在 A 进程中创建一个共享内存,并向其写入数据,通过 B 进程从共享内存中读取数据。

writer.c

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

#define BUFF_SIZE 1024

int main(int argc, char *argv[])
{
    int shmid;
    int ret;
    key_t key;
    char *shmadd;

    //创建key值
    key = ftok("./", 2021); 
    if(key == -1)
    {
         perror("error to ftok:");
             exit(-1);
    }

    //创建共享内存
    shmid = shmget(key, BUFF_SIZE, IPC_CREAT|0666); 
    if(shmid < 0) 
    { 
         perror("error to shmget:"); 
         exit(-1); 
    }

    //映射
    shmadd = shmat(shmid, NULL, 0);
    if(shmadd < 0)
    {
         perror("error to shmat:");
         exit(-1);
    }

    //拷贝数据至共享内存区
        printf("shmid=%d\n",shmid);
    printf("copy data to shared-memory\n");
    bzero(shmadd, BUFF_SIZE); // 共享内存清空
    strcpy(shmadd, "how are you, welcome to linux world!\n");

    return 0;
}

reader.c

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

#define BUFF_SIZE 1024

int main(int argc, char *argv[])
{
    int shmid;
    int ret;
    key_t key;
    char *shmadd;

    //创建key值
    key = ftok("./", 2021); 
    if(key == -1)
    {
        perror("error to ftok:");
            exit(-1);
    }

    system("ipcs -m"); //查看共享内存

    //打开共享内存
    shmid = shmget(key, BUFF_SIZE, IPC_CREAT|0666);
    if(shmid < 0) 
    { 
        perror("error to shmget:"); 
        exit(-1); 
    } 

    //映射
    shmadd = shmat(shmid, NULL, 0);
    if(shmadd < 0)
    {
        perror("error to shmat:");
        exit(-1);
    }

    //读共享内存区数据
    printf("data =%s\n", shmadd);

    //分离共享内存和当前进程
    ret = shmdt(shmadd);
    if(ret < 0)
    {
        perror("error to shmdt:");
        exit(1);
    }
    else
    {
        printf("deleted shared-memory\n");
    }

    //删除共享内存
    shmctl(shmid, IPC_RMID, NULL);
    system("ipcs -m"); //查看共享内存
    return 0;
}

运行结果:

[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./writer
shmid=32769
copy data to shared-memory
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./reader

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000072 0          root       444        1          5                       
0xe5010131 32769      root       666        1024       0                       

data =how are you, welcome to linux world!

deleted shared-memory

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000072 0          root       444        1          5