②消息隊列通訊 send.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #define MAX_TEXT 512 /*用於消息收發的結構體--my_msg_type:消息類型,some_text:消息正文*/ 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); } receive.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> /*用於消息收發的結構體--my_msg_type:消息類型,some_text:消息正文*/ 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;//接收消息的類型--0表示msgid隊列上的第一個消息 /*建立消息隊列*/ 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) { 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, 0) == -1) { fprintf(stderr, "msgctl(IPC_RMID) failed/n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }