自学内容网 自学内容网

Linux 共享内存

在Linux中,共享内存是一种进程间通信的机制,可以使不同进程之间共享同一块物理内存区域。

以下是在Linux中使用共享内存的步骤:

写入共享内存:

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

#define SHMGET_SIZE 1024

int main(){
char str_buff[1024];
    //1、生成一个键值  ftok("文件名和路径", '低于八位的标识符');
    key_t ftok_key=ftok("./share", 'a');
    if (ftok_key == -1)
    {
        perror("ftok");
        exit(1);
    }
    //2、创建共享内存 
    int shmage_id=shmget(ftok_key, SHMGET_SIZE, IPC_CREAT|0666);
    if (shmage_id == -1)
    {
          perror("shmget");
          exit(1);
    }
    //3、映射共享内存
    char *shmat_add=(char *)shmat(shmage_id, NULL, 0);
    if (shmat_add == (char *)(-1))
    {
          perror("shmat");
          exit(1);
    }
    //4、写入共享内容
    while (1)
    {
        fgets(str_buff, sizeof(str_buff), stdin);
        strcpy(shmat_add, str_buff);
        if (strncmp(shmat_add, "quit", 4) == 0)
        {
            printf("正在退出......\n");
            sleep(1);
            break;
        }
   
    
    }
    

return 0;
}

读内存

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

#define SHMGET_SIZE 1024

int main(){
char str_buff[1024];
    //1、生成一个键值
    key_t ftok_key=ftok("./share", 'a');
    if (ftok_key == -1)
    {
        perror("ftok");
        exit(1);
    }
    //2、创建共享内存
    int shmage_id=shmget(ftok_key, SHMGET_SIZE, IPC_CREAT|0666);
    if (shmage_id == -1)
    {
          perror("shmget");
          exit(1);
    }
    //3、映射共享内存
    char *shmat_add=(char *)shmat(shmage_id, NULL, SHM_RDONLY);
    if (shmat_add == (char *)(-1))
    {
          perror("shmat");
          exit(1);
    }
    //4、读共享内容
    //这里做了优化 一般读内存 会一直去读  但是一直去读 可能会重复读取很多一样的内容
    //使用strncmp去做比较 不同的时候才去拷贝内存的值
    while (1)
    {
               //优化过的
           if (strncmp(shmat_add, str_buff, 10) != 0) {
            strcpy(str_buff, shmat_add); // 更新 str_buff
            printf("%s", str_buff);
            sleep(1);
        }
        if (strncmp(shmat_add, "quit", 4) == 0)
        {
            printf("正在退出......\n");
            sleep(1);
            break;
        }
        }
        //5、不用了就分离接触
        if (shmdt(shmat_add) == -1)
        {
            perror("shmdt");
            return 1;
        }
return 0;
}


原文地址:https://blog.csdn.net/m0_58341340/article/details/143660445

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!