⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 share-mem.c

📁 Linux下C语言的共享内存编程
💻 C
字号:
/*
要运行程序,需要在当前目录下建立一个share文件,share是一个空文件,
没有任何意义,只是函数ftok需要一个文件名作参数,ftok另一个参数可以为任何数字。

程序运行后,分为父子进程,子进程申请共享内存,然后等待父进程继续执行,
父进程首先等待子进程申请到共享内存标识,然后输出共享内存中的内容,
为了演示共享内存可以随时更新,程序中在子进程里产生随机数写入共享内存供父进程读取。
代码如下:
*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>

#include<time.h>
#include<signal.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>

int                         shmID;
char                        *buf;

void finalize(int signo)
{
    shmctl(shmID,IPC_RMID,NULL);

    exit(0);
}

int main()
{
    int                     i = 1;  
    key_t                   shmKey;

    signal(SIGINT,finalize);
    signal(SIGTERM,finalize);

    if(fork() == 0) //子进程
    {  
        shmKey              = ftok("share",16);  //可以使用任何大于0的数字,如果名字和数相同,则产生的key相同。
        if(shmKey == -1)
        {
            printf("创建key出错\n");
            exit(-1);
        }

        shmID               = shmget(shmKey,20,IPC_CREAT | IPC_EXCL | 0666);
        if(shmID == -1)
        {
            printf("创建共享标识出错\n");
            exit(-1);
        }

        sleep(2); //等待父进程执行,好显示第一行为空。
        while(1)
        {
            buf             = (char *)shmat(shmID,NULL,0);
            srandom(time(NULL));
            sprintf(buf,"%d",random()); 
            shmdt(buf);  
        }
    }
    else  //父进程
    {
        sleep(1); //让子进程先执行,以建立内存映射。

        shmKey              = ftok("share",16);  //可以使用任何大于0的数字,如果名字和数相同,则产生的key相同。
        if(shmKey == -1)
        {
            printf("创建key出错\n");
            exit(-1);
        }

        shmID               = shmget(shmKey,20,0); //0表示如果shmKey映射的不存在则报错。
        if(shmID == -1)
        {
            printf("引用共享标识出错\n");
            exit(-1);
        }

        while(1)
        { 
            buf             = (char *)shmat(shmID,NULL,0);
            printf("%d. 现在共享内存中的内容为:%s\n",i++,buf);
            shmdt(buf);
            sleep(1);
        }
    }

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -