代码改变世界

linux 消息队列

2017-12-21 15:56  woodzcl  阅读(295)  评论(0编辑  收藏  举报

消息队列,这个可是鼎鼎大名,经常在某些地方看见大家那个膜拜,那个,嗯,那个。。。

那就给个完整的例子,大家欣赏就行,我一直认为不用那个,嗯@

这个队列的最大作用就是进程间通信,你要非搞个持久化,那也行,随你高兴喽!

——————————————————————————————————————

// 进程间通信,通过消息队列

//msgqueue-server.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/msg.h>

#include <signal.h>

 

#define MSG_FILE "/etc/passwd"

 

struct msg_form

{

    long mtype;

    char mtext[256];

};

 

static sig_atomic_t run =1;

 

void sigint(int signum)

{

    if (SIGINT==signum)

    {

        run = 0;

    }

}

 

 

int main()

{

    signal(SIGINT, sigint);

 

    int msqid;

    key_t key;

    struct msg_form msg;

    int len;

 

    if (0>(key=ftok(MSG_FILE, 'z')))

    {

        perror("ftok error!\n");

        exit(1);

    }

 

    printf("MSG -server key is %0x\n", key);

 

    if (-1==(msqid=msgget(key, IPC_CREAT|0777)))

    {

        perror("msgget error!\n");

        exit(1);

    }

 

    printf("msqid is %0x\n", msqid);

    printf("pid is %0x\n", getpid());

 

    while (run)

    {

        len = msgrcv(msqid, &msg, 256, 888, IPC_NOWAIT);

        if (0<len)

        {

            printf("MSG -server receive msg type is %0x\n", (unsigned int)msg.mtype);

            printf("MSG -server receive msg is %s\n", msg.mtext);

            msg.mtype = 999;

            sprintf(msg.mtext, "Hello, I'm server %0x\n", getpid());

            msgsnd(msqid, &msg, sizeof(msg.mtext), 0);

        }

    }

    printf("MSG -server quit!\n");

    if (-1==msgctl(msqid, IPC_RMID, 0))

    {

        printf("msqid %0x is rmed with error %d %s\n", msqid, errno, strerror(errno));

        exit(1);

    }

 

    return 0;

}

// msgqueue-client.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/msg.h>

#include <signal.h>

 

#define MSG_FILE "/etc/passwd"

 

struct msg_form

{

    long mtype;

    char mtext[256];

};

 

int main()

{

    int msqid;

    key_t key;

    struct msg_form msg;

    int isnd, len;

 

    if (0>(key=ftok(MSG_FILE, 'z')))

    {

        perror("ftok error!");

        exit(1);

    }

    printf("MSG -client key is %0x\n", key);

 

    if (-1==(msqid=msgget(key, 0777)))

    {

        perror("msgget error");

        exit(1);

    }

 

    printf("msqid is %0x\n", msqid);

    printf("pid is %0x\n", getpid());

 

    msg.mtype = 888;

    sprintf(msg.mtext, "Hello, I'm client %0x\n", getpid());

    isnd = msgsnd(msqid, &msg, sizeof(msg.mtext), IPC_NOWAIT);

 

    if (0==isnd)

    {

        len = msgrcv(msqid, &msg, 256, 999, 0);

        if (0<len)

        {

            printf("MSG -client receive msg type is %0x\n", (unsigned int)msg.mtype);

            printf("MSG -client receive msg is %s\n", msg.mtext);

        }

    }

 

    return 0;

}

// result

# ./msgqueue-server &
[1] 2588
MSG -server key is 7a011886
msqid is 28000
pid is a1c

# ./msgqueue-client &
[2] 2592
MSG -client key is 7a011886
msqid is 28000
pid is a20
MSG -server receive msg type is 378
MSG -server receive msg is Hello, I'm client a20

MSG -client receive msg type is 3e7
MSG -client receive msg is Hello, I'm server a1c

[2]+ Done ./msgqueue-client

e# jobs
[1]- Running ./msgqueue-server &

# fg 1
./msgqueue-server
^CMSG -server quit!

Finally:

用好了,还是挺强大的啊