systemV訊息佇列
阿新 • • 發佈:2018-11-11
參考命令:
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); } // 向訊息隊裡中寫訊息,直到寫入endwhile (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次。