wangzhengquan
2020-07-14 fb1289e6d069e1a0f14dd45ba07720f09e90ab56
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "shm_queue_wrapper.h"
 
 
typedef struct msg_t
{
    int key;
    char buf[100];
    
} msg_t;
 
 
static void * remote_queues[100];
static int remote_queues_len = 0;
 
void *pub(void *) {
    msg_t send_msg;
    send_msg.key = 1;
    while(true) {
        for(int i = 0; i < remote_queues_len; i++ ) {
            sprintf(send_msg.buf, "今日头条××××");
            shmqueue_push(remote_queues[i], (void *)&send_msg, sizeof(send_msg));
        }
        sleep(2);
    }
}
 
void server() {
     void * msg;
     int msg_size;
     
     int key = 1;
    size_t qsize = 16;
    void * local_queue = shmqueue_create( &key, qsize);
    
 
    pthread_t tid;
     pthread_create(&tid, NULL, pub, NULL);
    
    while(shmqueue_pop(local_queue, &msg, &msg_size) ) {
        void * remote_queue = shmqueue_attach(((msg_t *)msg)->key);
        remote_queues[remote_queues_len++] = remote_queue;
        printf("收到订阅请求", ((msg_t *)msg)->buf);
       
       
        // shmqueue_drop(remote_queue);
       // cout <<  item.pic << endl;
        // i++;
    }
 
    //销毁队列
    shmqueue_drop(local_queue);
}
 
 
int main () {
    shm_init(512);
    server();
 
    //整个进程退出时需要执行这个方法,该方法首先会检查是否还有其他进程在使用该共享内存,如果还有其他进程在使用就只是detach,如果没有其他进程在使用则销毁整块内存。
    shm_destroy();
    return 0;
}