1. 程式人生 > >systemV訊息佇列

systemV訊息佇列

參考命令:

1.  ipcs

2.  ipckill

例子參考了網路,作者不詳。

傳送資料

#include <stdlib.h>

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
#include <errno.h>
 
#define MAX_TEXT 512
 
struct msg_st
{
    long int msg_type;
    char text[MAX_TEXT];
};
 
int main(int argc, char **argv) { struct msg_st data; char buffer[BUFSIZ]; int msgid = -1; // 建立訊息佇列 msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if (msgid == -1) { fprintf(stderr, "msgget failed error: %d\n", errno); exit(EXIT_FAILURE); } // 向訊息隊裡中寫訊息,直到寫入end
while (1) { printf("Enter some text: \n"); fgets(buffer, BUFSIZ, stdin); data.msg_type = 1; // 注意2 strcpy(data.text, buffer); // 向佇列裡傳送資料 if (msgsnd(msgid, (void *)&data, MAX_TEXT, 0) == -1) { fprintf(stderr, "msgsnd failed\n
"); exit(EXIT_FAILURE); } // 輸入end結束輸入 if (strncmp(buffer, "end", 3) == 0) { break; } sleep(1); } exit(EXIT_SUCCESS); }

接受程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#include <errno.h>
 
struct msg_st
{
    long int msg_type;
    char text[BUFSIZ];
};
 
int main(int argc, char **argv)
{
    int msgid = -1;
    struct msg_st data;
    long int msgtype = 0;   // 注意1
 
    // 建立訊息佇列
    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
    if (msgid == -1)
    {
        fprintf(stderr, "msgget failed width error: %d\n", errno);
        exit(EXIT_FAILURE);
    }
 
    // 從佇列中獲取訊息,直到遇到end訊息為止
    while (1)
    {
        if (msgrcv(msgid, (void *)&data, BUFSIZ, msgtype, 0) == -1)
        {
            fprintf(stderr, "msgrcv failed width erro: %d", errno);
        }
 
        printf("You wrote: %s\n", data.text);
 
        // 遇到end結束
        if (strncmp(data.text, "end", 3) == 0)
        {
            break;
        }
    }
 
    // 刪除訊息佇列
    if (msgctl(msgid, IPC_RMID, 0) == -1)
    {
        fprintf(stderr, "msgctl(IPC_RMID) failed\n");
    }
 
    exit(EXIT_SUCCESS);
}

以傳送一個檔案為例,資料流:

輸入檔案->使用者傳送程式->核心IPC(管道,FIFO,訊息佇列)->接收端->輸出檔案

一共4次系統呼叫。相比共享記憶體要多2次。