代码示例_IPC_消息队列
消息队列
1.头文件
#ifndef __MSG_H__ #define __MSG_H__ #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ long mtype; char mtext[1024]; }msgbuf; key_t Get_Key(void); int Msg_Creat(key_t key); ssize_t Msg_Read(int msgid,void *msg_buf, size_t msg_size); int Msg_Write(int msgid, const void *msg_buf, size_t msg_size); int Msg_Delet(int msgid); #endif
2. msg.c
#include"msg.h" //获取key key_t Get_Key(void) { key_t key =ftok("/",0x66); if(key <0){ perror("Get_Key ftok failed"); exit(1); } return key; } //创建获取 int Msg_Creat(key_t key) { int msgid = msgget(key,0666|IPC_CREAT); if(msgid<0){ perror("msgget failed"); exit(1); } return msgid; } //读 ssize_t Msg_Read(int msgid,void *msg_buf, size_t msg_size) { ssize_t msgrcv_num =msgrcv(msgid,msg_buf,msg_size,0,0); if(msgrcv_num <0){ perror("Msg_Read msgrcv failed"); exit(1); } return msgrcv_num; } //写 int Msg_Write(int msgid, const void *msg_buf, size_t msg_size) { int msgsnd_num =msgsnd(msgid,msg_buf,msg_size,0); if(msgsnd_num<0){ perror("Msg_Write msgsnd failed"); exit(1); } return msgsnd_num; } //删除 int Msg_Delet(int msgid) { int msgctl_rel =msgctl(msgid,IPC_RMID,NULL); if(msgctl_rel <0){ perror("Msg_Delet msgctl failed"); exit(1); } return msgctl_rel; }
2.server
#include "msg.h" msgbuf msgbuf_t; int main(void) { key_t key =Get_Key(); int msgid =Msg_Creat(key); memset(&msgbuf_t, 0, sizeof(msgbuf_t)); while(1){ msgbuf_t.mtype =6; Msg_Read(msgid,&msgbuf_t,sizeof(msgbuf_t)); fputs(msgbuf_t.mtext, stdout); if(strncmp(msgbuf_t.mtext, "quit", 4)==0) break; } Msg_Delet(msgid); return 0; }
3.client
#include "msg.h" msgbuf msgbuf_t; int main(void) { key_t key =Get_Key(); int msgid =Msg_Creat(key); memset(&msgbuf_t, 0, sizeof(msgbuf_t)); while(1){ msgbuf_t.mtype =6; fgets(msgbuf_t.mtext, 1024, stdin); Msg_Write(msgid,&msgbuf_t,sizeof(msgbuf_t)); if(strncmp(msgbuf_t.mtext, "quit", 4)==0) break; } Msg_Delet(msgid); return 0; }
success !
Stay hungry, stay foolish
待续。。。