zoukankan      html  css  js  c++  java
  • 共享内存shm*(生产者和消费者)

    //heads.h
    #ifndef HEAD_H
    #define HEAD_H
    #include <iostream>
    #include <sys/shm.h> //share momery
    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "shm_com.h"
    #endif // HEAD_H
    View Code
    shm_com.h
    #ifndef SHM_COM
    #define SHM_COM
    
    #define TEXT_SZ 2048
    struct shared_use_st{
        int written_by_you;
        char some_text[TEXT_SZ];
    };
    
    #endif // SHM_COM
    View Code

    consumer.cpp

    #include "headers.h"
    using namespace std;
    //consumer
    int main()
    {
        int running = 1;
        void *shared_memory = (void *)0;
        struct shared_use_st *shared_stuff;
        int shmid;
        
        srand((unsigned int)getpid());
        
        shmid = shmget((key_t)1234, sizeof(struct shared_use_st),0666|IPC_CREAT);
        
        if(shmid == -1)
        {
            fprintf(stderr, "shmget failed
    ");
            exit(EXIT_FAILURE);
        }
        
        //sec let sys select shm address,
        //thi SHM_RND or SHM_RDONLY
        shared_memory = shmat(shmid, (void *)0, 0);
        if(shared_memory == (void *)-1)
        {
            fprintf(stderr, "shmat failed
    ");
            exit(EXIT_FAILURE);
        }
        
        printf("Memory attached at %X
    ",(unsigned int)(long)shared_memory);
        
        shared_stuff = (struct shared_use_st *)shared_memory;
        shared_stuff->written_by_you = 0;
    
        while (running) {
            if (shared_stuff->written_by_you) {
                printf("You wrote: %s", shared_stuff->some_text);
                sleep(rand()%4);
                shared_stuff->written_by_you = 0;
                if (strncmp(shared_stuff->some_text, "end", 3) == 0) {
                    running = 0;
                }
            }
        }
        
        //shm devide and rm
        if(shmdt(shared_memory) == -1){
            fprintf(stderr, "shmdt failed
    ");
            exit(EXIT_FAILURE);
        }
        
        if(shmctl(shmid, IPC_RMID, 0) == -1){
            fprintf(stderr, "shctl(IPC_RMID) failed 
    ");
            exit(EXIT_FAILURE);
        }
    
        exit(EXIT_SUCCESS);
    }
    View Code

    producer.cpp

    #include "headers.h"
    using namespace std;
    //producer
    int main()
    {
        int running = 1;
        void *shared_memory = (void *)0;
        struct shared_use_st *shared_stuff;
        char buffer[BUFSIZ];
        int shmid;
    
        shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
        //
        if (shmid == -1) {
            fprintf(stderr, "shmget failed
    ");
            exit(EXIT_FAILURE);
        }
    
        shared_memory =shmat(shmid, (void *)0, 0);
    
        if(shared_memory == (void *)-1){
            fprintf(stderr, "shmat failed
    ");
            exit(EXIT_FAILURE);
        }
    
        printf("memory attached at %X
    ", (unsigned int)(long)shared_memory);
    
        shared_stuff = (struct shared_use_st *)shared_memory;
    
        while (running) {
            while (shared_stuff->written_by_you == 1) {
                sleep(1);
                printf("waiting for client...
    ");
            }
    
            printf("Enter some text: ");
            fgets(buffer, BUFSIZ, stdin);
    
            strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
            shared_stuff->written_by_you = 1;
    
            if(strncmp(buffer, "end", 3) == 0){
                running = 0;
            }
        }
    
        if(shmdt(shared_memory) == -1){
            fprintf(stderr, "shmdt failed
    ");
            exit(EXIT_FAILURE);
        }
        return 0;
    }
    View Code

    unix编程一书

  • 相关阅读:
    Java18(泛型,反射,内省)
    Java17(线程池、Runnable和Callable、Lock、信号量、任务调度、Timer)
    Javaday16(守护线程,线程同步,线程通讯)
    面试题错题集04(异常)
    面试题错题集03(数组)
    面试题错题集02(面向对象)
    Javaday15(Queue,Collections工具类,多线程)
    Java中的内部接口
    ISO14229:2013 之 通过标志读数据ReadDataByIdentifier (0x22)
    Oracle数据库迁移至PostgreSQL数据库问题及解决
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/5671832.html
Copyright © 2011-2022 走看看