消息队列

本秂侑毒 提交于 2020-02-23 02:48:57

接收者1:按顺序接收

/* Here's the receiver program. */



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/msg.h>
struct my_msg_st {

    long int my_msg_type;

    char some_text[BUFSIZ];

};
int main()
{

    int running = 1;

    int msgid;

    struct my_msg_st some_data;

    long int msg_to_receive = 0;
    int receivedata = 0;



/* First, we set up the message queue. */
 	printf("Enter some text: %d \n",BUFSIZ);



    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);



    if (msgid == -1) {

        fprintf(stderr, "msgget failed with error: %d\n", errno);

        exit(EXIT_FAILURE);

    }



/* Then the messages are retrieved from the queue, until an end message is encountered.

 Lastly, the message queue is deleted. */



    while(running) {

        if ((receivedata = msgrcv(msgid, (void *)&some_data, BUFSIZ,

                   msg_to_receive, 0)) == -1) {

            fprintf(stderr, "msgrcv failed with error: %d\n", errno);

            exit(EXIT_FAILURE);

        }

        printf("You wrote: %s data length:%d \n", some_data.some_text,receivedata);

        if (strncmp(some_data.some_text, "end", 3) == 0) {

            running = 0;

        }

    }

#if 0

    if (msgctl(msgid, IPC_RMID, 0) == -1) {

        fprintf(stderr, "msgctl(IPC_RMID) failed\n");

        exit(EXIT_FAILURE);

    }

#endif 

    exit(EXIT_SUCCESS);

}


接收者2:接收特定类型

/* Here's the receiver program. */



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/msg.h>
struct my_msg_st {
    long int my_msg_type;
    char some_text[BUFSIZ];
};
int main()
{

    int running = 1;

    int msgid;

    struct my_msg_st some_data;

    long int msg_to_receive = 1;
    int receivedata = 0;



/* First, we set up the message queue. */
 	printf("Enter some text: %d \n",BUFSIZ);



    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);



    if (msgid == -1) {

        fprintf(stderr, "msgget failed with error: %d\n", errno);

        exit(EXIT_FAILURE);

    }



/* Then the messages are retrieved from the queue, until an end message is encountered.

 Lastly, the message queue is deleted. */



    while(running) {

        if ((receivedata = msgrcv(msgid, (void *)&some_data, BUFSIZ,

                   msg_to_receive, 0)) == -1) {

            fprintf(stderr, "msgrcv failed with error: %d\n", errno);

            exit(EXIT_FAILURE);

        }

        printf("You wrote: %s data length:%d \n", some_data.some_text,receivedata);

        if (strncmp(some_data.some_text, "end", 3) == 0) {

            running = 0;

        }

    }

#if 0

    if (msgctl(msgid, IPC_RMID, 0) == -1) {

        fprintf(stderr, "msgctl(IPC_RMID) failed\n");

        exit(EXIT_FAILURE);

    }

#endif

    exit(EXIT_SUCCESS);

}


发送者:

/* The sender program is very similar to msg1.c. In the main set up, delete the

 msg_to_receive declaration and replace it with buffer[BUFSIZ], remove the message

 queue delete and make the following changes to the running loop.

 We now have a call to msgsnd to send the entered text to the queue. */



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/msg.h>
#define MAX_TEXT 512
struct my_msg_st {
    long int my_msg_type;
    char some_text[MAX_TEXT];
};
int main()
{
    int running = 1;
    struct my_msg_st some_data;
    int msgid;
    char buffer[BUFSIZ];
    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
    if (msgid == -1) {
        fprintf(stderr, "msgget failed with error: %d\n", errno);
        exit(EXIT_FAILURE);
    }



    while(running) {

        printf("Enter some text: %d \n",BUFSIZ);

        fgets(buffer, BUFSIZ, stdin);

        some_data.my_msg_type = 1;//改变发送类型

        strcpy(some_data.some_text, buffer);



        if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) {

            fprintf(stderr, "msgsnd failed\n");

            exit(EXIT_FAILURE);

        }

        if (strncmp(buffer, "end", 3) == 0) {

            running = 0;

        }

    }
    exit(EXIT_SUCCESS);
}


1.接收者可按照特定类型的消息接收,也可按照顺序接收。
2.发送者发送特定类型的消息
3.发送者和接收者不需要进程自己提供同步方法

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!