例子: 通過消息隊列實現兩個進程間通信,一個進程從終端輸入數據,通過消息隊列發送,另一個進程通過消息隊列接收數據
文件1 創建進程1 終端輸入通過消息隊列發送數據
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> struct msgbuf //消息結構體 { long types; char msg[20]; }; struct msgbuf mymsgbuf; //定義消息結構變量 int main(int argc, const char *argv[]) { key_t key; int msgid; mymsgbuf.types = 100; //給消息結構賦值 key = ftok("./app",'a'); //建立key值 if(key < 0) { perror("ftok fail "); exit(1); } // 創建消息隊列,如果消息隊列存在,errno 會提示 eexist // 錯誤,此時只需要直接打開消息隊列即可 msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666); if(msgid < 0) { if(errno == EEXIST) //文件存在錯誤提示 { msgid = msgget(key,0666);//打開消息隊列 } else //其他錯誤退出 { perror("msgget fail "); exit(1); } } while(1) //循環從終端獲取數據,然后通過消息隊列發送出去,輸入 “quit” 結束循環 { fgets(mymsgbuf.msg, 10, stdin); //終端獲取消息寫入消息隊列中 //發送消息 msgsnd(msgid, &mymsgbuf, sizeof(mymsgbuf)-sizeof(long),0); if(strstr(mymsgbuf.msg, "quit")!=NULL) { break; } } //刪除消息隊列 msgctl(msgid, IPC_RMID, NULL); return 0; }
文件 2 創建進程2 ,接收消息隊列的數據,打印到終端上
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> struct msgbuf //消息結構體 { long types; char b[20]; }; struct msgbuf mymsgbuf, recvbuf; //定義消息結構變量 int main(int argc, const char *argv[]) { key_t key; int msgid; mymsgbuf.types = 100; //給消息結構賦值 key = ftok("./app",'a'); //建立key值 if(key < 0) { perror("ftok fail "); exit(1); } // 創建消息隊列,如果消息隊列存在,errno 會提示 eexist // 錯誤,此時只需要直接打開消息隊列即可 msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666); if(msgid < 0) { if(errno == EEXIST) //文件存在錯誤提示 { msgid = msgget(key,0666);//打開消息隊列 } else //其他錯誤退出 { perror("msgget fail "); exit(1); } } while(1) //接收到 “quit” 結束循環 { //接收消息 msgrcv(msgid,&recvbuf,sizeof(mymsgbuf)-sizeof(long),100,0); //recvbuf 是接收消息的結構體,其中的b是實際的數據 if(strstr(recvbuf.b, "quit") != NULL) { break; } printf("recvbuf: %s", recvbuf.b); // } //刪除消息隊列 msgctl(msgid, IPC_RMID, NULL); return 0; }
測試: