消息队列

接收者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.发送者和接收者不需要进程自己提供同步方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值