commMsgQueue.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "commMsgQueue.h"
  2. static int commMsgQueue(int flags)
  3. {
  4. key_t _key = ftok(PATHNAME,PROJ_ID);//ftok参数有两个,第一个是路径变量,第二个是projectID
  5. if(_key < 0){
  6. perror("ftok");
  7. return -1;
  8. }
  9. int msgid = msgget(_key,flags);
  10. if(msgid < 0){
  11. perror("msgget");
  12. return -2;
  13. }
  14. return msgid;
  15. }
  16. int creatMsgQueue()
  17. {
  18. return commMsgQueue(IPC_CREAT | IPC_EXCL|0666);
  19. }
  20. int getMsgQueue()
  21. {
  22. return commMsgQueue(IPC_CREAT);
  23. }
  24. int destroyMsgQueue(int msgid)
  25. {
  26. if(msgctl(msgid, IPC_RMID, NULL) < 0){
  27. perror("msgctl");
  28. return -1;
  29. }
  30. return 0;
  31. }
  32. int sendMsg(int msgid, int type, const char *msg)
  33. {
  34. struct msgbuf _mb;
  35. _mb.mtype = type;
  36. strcpy(_mb.mtext,msg);
  37. if(msgsnd(msgid, &_mb,sizeof(_mb.mtext),0)<0){
  38. perror("msgsnd");
  39. return -1;
  40. }
  41. return 0;
  42. }
  43. int recvMsg(int msgid, int type, char *out)
  44. {
  45. struct msgbuf _mb;
  46. if(msgrcv(msgid, &_mb, sizeof(_mb.mtext),type,IPC_NOWAIT)<0){ //0.阻塞 IPC_NOWAIT.非阻塞
  47. //perror("msgrcv");
  48. return -1;
  49. }
  50. strcpy(out,_mb.mtext);
  51. return 0;
  52. }