消息队列MQ

100_进程通信_使用共享内存,发布通知(10条)给到3个进程【向共享内存写、读,创建的消息队列键值,必须一致,打开同一块共享内存】

本文主要是介绍100_进程通信_使用共享内存,发布通知(10条)给到3个进程【向共享内存写、读,创建的消息队列键值,必须一致,打开同一块共享内存】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

动图:

在这里插入图片描述

往共享内存写东西:

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


int main()
{

    key_t key = ftok("./", 2101);
    if(key != -1)
    {
        printf("key = %d\n", key);
    }


    //创建、打开共享内存
    int shmiod = shmget(key, 512 ,IPC_CREAT | 0666);
    if(shmiod != -1)
    {
        printf("shmiod = %d\n", shmiod);
    }


    //为共享内存,建立映射
    char *str_add = (char *)shmat(shmiod, NULL, 0);


    //=============== 向共享内存建立映射的地址上'写'东西 =============================//
    int i = 0;
    char buf[123] = "";
    while(1)
    {
        sleep(2);
        sprintf(buf, "this is %d mesg", i);
        strcpy(str_add, "hello word");
        i++;
    }



    sleep(3);
    shmdt(str_add);
    

    //删除共享内存
    int shmidctl = shmctl(shmiod, IPC_RMID, NULL);
    if(shmidctl != -1)
    {
        printf("删除成功\n");
    }



    return 0;
}

从共享内存读东西:

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


int main()
{

    key_t key = ftok("./", 2101);
    if(key != -1)
    {
        printf("key = %d\n", key);
    }


    //创建、打开共享内存
    int shmiod = shmget(key, 512 ,IPC_CREAT | 0666);
    if(shmiod != -1)
    {
        printf("shmiod = %d\n", shmiod);
    }


    //为共享内存,建立映射
    char *str_add = (char *)shmat(shmiod, NULL, 0);

    pid_t pid;
    int i = 0;
    for(; i < 3; i++)
    {
        pid = fork();
        if(pid == 0)
        {
            break;
        }
    }


    if(0 == i)
    {
            //================== 从共享内存建立映射的地址上读str_add =================================//
        int x = 0;
        while (1)
        {
            sleep(1);    
            if(str_add != NULL)
            {
                printf("子进程 1 第 %d 映射地址建立成功:%s\n", x, str_add);
            }
            x++;
            if(x == 10)
            {
                printf("映射信息不在接收-退出\n");
                break;
            }
        }
    }
    else if(1 == i)
    {
        int x = 0;
        while (1)
        {
            sleep(1);    
            if(str_add != NULL)
            {
                printf("子进程 2 第 %d 映射地址建立成功:%s\n", x, str_add);
            }
            x++;
            if(x == 10)
            {
                printf("映射信息不在接收-退出\n");
                break;
            }
        }
    }
    else if(2 == i)
    {
        int x = 0;
        while (1)
        {
            sleep(1);    
            if(str_add != NULL)
            {
                printf("子进程 3 第 %d 映射地址建立成功:%s\n", x, str_add);
            }
            x++;
            if(x == 10)
            {
                printf("映射信息不在接收-退出\n");
                break;
            }
        }
    }
    else
    {
        while (1)
        {
            pid = waitpid(-1, NULL, WNOHANG);
            if(pid > 0)
            {
                printf("回收的子进程号:%d\n",pid);    
            }
            else if(pid == 0)
            {
                continue;
            }
            else
                break;
        }
        
    }


    sleep(2);
    shmdt(str_add);//解除映射




    //删除共享内存
    int shmidctl = shmctl(shmiod, IPC_RMID, NULL);
    if(shmidctl != -1)
    {
        printf("删除成功\n");
    }



    return 0;
}
这篇关于100_进程通信_使用共享内存,发布通知(10条)给到3个进程【向共享内存写、读,创建的消息队列键值,必须一致,打开同一块共享内存】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!