UNIX消息队列

发送端:

/* 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: ");  
        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);  
}  

接受端:

/* 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;  
  
/* First, we set up the message queue. */  
  
    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 (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", some_data.some_text);  
        if (strncmp(some_data.some_text, "end", 3) == 0) {  
            running = 0;  
        }  
    }  
  
    if (msgctl(msgid, IPC_RMID, NULL) == -1) {  
        fprintf(stderr, "msgctl(IPC_RMID) failed\n");  
        exit(EXIT_FAILURE);  
    }  
  
    exit(EXIT_SUCCESS);  
}  


IPC status from <running system> as of Wed Jun 13 20:46:23 CST 2012
T         ID      KEY        MODE        OWNER    GROUP
Message Queues:
q 1610612787   0x4d2      --rw-rw-rw-      cms    staff
q 1644167215   0x720044b6 --rw-rw----      fis    staff
q 1644167214   0x730044b6 -Rrw-rw----      fis    staff
q 1644167213   0x72004551 --rw-rw----      cms    staff
q 1644167212   0x73004551 -Rrw-rw----      cms    staff
q 1543503907   0x72004552 --rw-rw----      cms    staff
q 1644167201   0x73004552 -Rrw-rw----      cms    staff
q 1644167199   0x72007917 --rw-rw----      sec    staff
q 1627389982   0x73007917 -Rrw-rw----      sec    staff
q 1627389981   0x720040a6 --rw-rw----      wms    staff
q 1644167196   0x730040a6 -Rrw-rw----      wms    staff
q 1627389979   0x72007faa --rw-rw----      eds    staff
q 1610612762   0x73007faa -Rrw-rw----      eds    staff
q 1627389977   0x72004e62 --rw-rw----      mms    staff
q 1627389976   0x73004e62 -Rrw-rw----      mms    staff

 

DBDSAPP01 /app/cms/test 24>ipcrm -Q 0x4d2
DBDSAPP01 /app/cms/test 25>
DBDSAPP01 /app/cms/test 25>ipcs -q
IPC status from <running system> as of Wed Jun 13 20:46:42 CST 2012
T         ID      KEY        MODE        OWNER    GROUP
Message Queues:
q 1644167215   0x720044b6 --rw-rw----      fis    staff
q 1644167214   0x730044b6 -Rrw-rw----      fis    staff
q 1644167213   0x72004551 --rw-rw----      cms    staff
q 1644167212   0x73004551 -Rrw-rw----      cms    staff
q 1543503907   0x72004552 --rw-rw----      cms    staff
q 1644167201   0x73004552 -Rrw-rw----      cms    staff
q 1644167199   0x72007917 --rw-rw----      sec    staff
q 1627389982   0x73007917 -Rrw-rw----      sec    staff
q 1627389981   0x720040a6 --rw-rw----      wms    staff
q 1644167196   0x730040a6 -Rrw-rw----      wms    staff
q 1627389979   0x72007faa --rw-rw----      eds    staff
q 1610612762   0x73007faa -Rrw-rw----      eds    staff
q 1627389977   0x72004e62 --rw-rw----      mms    staff
q 1627389976   0x73004e62 -Rrw-rw----      mms    staff

msgctl(msgid, IPC_RMID, NULL)最后一个参数为NULL,否则,不能删除。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值