ipc.c
上传用户:sdtbys
上传日期:2009-12-06
资源大小:13k
文件大小:10k
源码类别:

并口编程

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/ipc.h>
  4. #include <sys/msg.h>
  5. #include <sys/sem.h>
  6. #include <sys/shm.h>
  7. #include <memory.h>
  8. #include <errno.h>
  9. extern int errno;
  10. #include "ipc.h"
  11. /* typedef long key_t  (IPC KEY) */ 
  12. /* ipcs|ipcrm  IPC msg|sem|shm IPC ID IPC KEY */
  13. /* struct ipc_perm { key_t key;
  14.                      ushort uid;
  15.                      ushort gid;
  16.                      ushort cid;
  17.                      ushort cgid;
  18.                      ushort mode;}
  19. */
  20. /**********************************************************
  21.  Function msgCreate
  22.    Create message queue
  23.  Parameters :
  24. key    : key which identify message queue
  25.  Return :
  26. iMsgId : message queue id
  27. ***********************************************************/
  28. int msgCreate(key_t key)
  29. {
  30.   int iMsgId;
  31.   
  32.   iMsgId=msgget(key,IPC_CREAT | IPC_EXCL | QPERM);
  33.   if (iMsgId<0) {
  34.      if (errno==EEXIST) {
  35.         ShowMsg("msg has exist! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  36.         iMsgId=msgget(key,QPERM);
  37.         if (iMsgId<0) 
  38.         {
  39.         ShowMsg("msg open failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  40.          return(MsgOpenFail);
  41.         }
  42.         return iMsgId;
  43.      }
  44.         ShowMsg("msg create failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  45.      return MsgCreateFail;
  46.   };
  47.   return iMsgId;
  48. }
  49. /**********************************************************
  50.  Function msgOpen
  51.    Open message queue , this queue must be existed .
  52.  Parameters :
  53. key    : key which identify message queue
  54.  Return :
  55. iMsgId : message queue id
  56. ***********************************************************/
  57. int msgOpen(key_t key)  
  58. {
  59.   int iMsgId;
  60.   if ((iMsgId=msgget(key,QPERM))==-1) {
  61.      ShowMsg("msg open failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  62.      return MsgOpenFail;
  63.   }
  64.   return iMsgId;
  65. }
  66. /**********************************************************
  67.  Function msgStatus
  68.    Output message queue status to a file
  69.  Parameters :
  70. iMsgId : message queue id
  71. fpOut  : output file handle
  72. ***********************************************************/
  73. int msgStatus(int iMsgId)
  74. {
  75.   struct msqid_ds msg_status;
  76.   int i;
  77.   if (msgctl(iMsgId,IPC_STAT,&msg_status) < 0 ) {
  78.      return MsgStateFail;
  79.   }
  80.   /*printf("nThe Msg Status is:"); */
  81.   ShowMsg("msg id=%inuid=%ingid=%inmode=%on"
  82.   "msgnum=%inmsgqbytes=%incbytes=%in"
  83.   "lspid=%inlrpid=%in",iMsgId,
  84.   msg_status.msg_perm.uid,msg_status.msg_perm.gid,
  85.   msg_status.msg_perm.mode,msg_status.msg_qnum,
  86.   msg_status.msg_qbytes,msg_status.msg_cbytes,msg_status.msg_lspid,
  87.   msg_status.msg_lrpid);
  88.   return(0);
  89. }
  90. /**********************************************************
  91.  Function msgSendBuf
  92.    Send info to message queue
  93.  Parameters :
  94. iMsgId   : message queue id
  95. lType    : message type identify message info in the same queue
  96. pszInfo  : info to be sent
  97. iInfoLen : length of info
  98. ***********************************************************/
  99. int msgSend(int iMsgId , long lType , char *pszInfo , int iInfoLen)
  100. {
  101.   Mesg mesg;
  102.   if (iInfoLen>MaxMesgLen)
  103.    { ShowMsg("msg len error! len=%d,maxlen=%dn",iInfoLen,MaxMesgLen);
  104.      return (MsgMesgLenBad);}
  105.   mesg.MesgId=lType;
  106.   memcpy(mesg.MesgText,pszInfo,iInfoLen);
  107.   if (msgsnd(iMsgId,&mesg,iInfoLen,0)==-1) {
  108.      ShowMsg("msg send failed! errno=%d error=%sn",errno,strerror(errno));
  109.      return MsgSendFail;
  110.   }
  111.   return (0);
  112. }
  113. /**********************************************************
  114.  Function msgRecvBuf
  115.    Receive info from message queue
  116.  Parameters :
  117. iMsgId   : message queue id
  118. lType    : message type identify message info in the same queue
  119. pszInfo  : info buffer to be received
  120. iRecvLen : length of info
  121. iTimeOut : timeout , if =0 , nowait .
  122. ***********************************************************/
  123. int msgRecv(int iMsgId , long *lType , char *pszInfo , int iExptLen)
  124. {
  125.   Mesg mesg;
  126.   int iRecvLen;
  127.   if (iExptLen>MaxMesgLen)
  128.    { ShowMsg("msg len error! len=%d,maxlen=%dn",iExptLen,MaxMesgLen);
  129.      return (MsgMesgLenBad);}
  130.    /*if ((iRecvLen=msgrcv(iMsgId,&mesg,iExptLen,lType,IPC_NOWAIT))==-1) {
  131.  return MsgRecvFail;
  132.      }*/
  133.      if ((iRecvLen=msgrcv(iMsgId,&mesg,iExptLen,*lType,0))==-1) {
  134.      ShowMsg("msg recv failed! errno=%d error=%sn",errno,strerror(errno));
  135.  return MsgRecvFail;
  136.   }
  137.   memcpy(pszInfo,mesg.MesgText,iRecvLen);
  138.   *lType=mesg.MesgId;
  139.   return iRecvLen;
  140. }
  141. /**********************************************************
  142.  Function msgRemove
  143.    Remove message queue
  144.  Parameters :
  145. iMsgId   : message queue id
  146. ***********************************************************/
  147. int msgRemove(int iMsgId)
  148. {
  149.   if (msgctl(iMsgId,IPC_RMID,0) <0) {
  150.      ShowMsg("msg remove failed! errno=%d error=%sn",errno,strerror(errno));
  151.      return MsgRemoveFail;
  152.   }
  153.   return (0);
  154. }
  155. /*************************************************************
  156. Function semCreate
  157.   Create one array semaphores 
  158. Parameters
  159. key : key of identifier
  160. *************************************************************/
  161. int semCreate(key_t key)
  162. {
  163.   int iSemId,iRet;
  164.   iSemId=semget(key,1,IPC_CREAT | IPC_EXCL | QPERM);
  165.   if (iSemId<0) {
  166.      if (errno==EEXIST) {
  167.         ShowMsg("sem existed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  168.         iSemId=semget(key,0,QPERM);
  169. if (iSemId<0) 
  170.     {
  171.      ShowMsg("sem open failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  172.      return(SemOpenFail);
  173.     }
  174.         /************************************
  175.    iRet=semctl(iSemId,0,SETVAL,0);
  176.    if(iRet<0) return(SemSetValFail);
  177.         ************************************/
  178.         return(iSemId);
  179.      }
  180.      ShowMsg("sem create failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  181.      return(SemCreateFail);
  182.   }
  183.   iRet=semctl(iSemId,0,SETVAL,0);
  184.   if(iRet<0) 
  185.   { 
  186.    ShowMsg("sem init 0 failed! key=%d sem=%d errno=%d error=%sn",key,iSemId,errno,strerror(errno));
  187.    return(SemSetValFail);
  188.   }
  189.   return(iSemId);
  190. }
  191. /*************************************************************
  192. Function semOpen
  193.   Open one array semaphores 
  194. Parameters
  195. key : key of identifier
  196. *************************************************************/
  197. int semOpen(key_t key)
  198. {
  199.   int iSemId,iRet;
  200.   iSemId=semget(key,0,QPERM);
  201.   if (iSemId<0) {
  202.      ShowMsg("sem open failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  203.      return(SemOpenFail);
  204.   }
  205.   /*********************************
  206.   iRet=semctl(iSemId,0,SETVAL,0);
  207.   if(iRet<0) return(SemSetValFail);
  208.   **********************************/
  209.   return(iSemId);
  210. }
  211. /*************************************************************
  212. Function semOn
  213.   if value of semp is 1 , set to 0 
  214.   if not return false 
  215. Parameters
  216. iSemId : handle of semp
  217. *************************************************************/
  218. int semLock(int iSemId)
  219.   struct sembuf sembuf;
  220.   sembuf.sem_num=0;
  221.   sembuf.sem_op=-1;
  222. /*sembuf.sem_flg=IPC_NOWAIT | SEM_UNDO ;*/
  223.   sembuf.sem_flg=0;
  224.   if(semop(iSemId,&sembuf,1)<0)
  225.   {
  226.    ShowMsg("sem lock failed! errno=%d error=%sn",errno,strerror(errno));
  227.    return(SemLockFail);
  228.   }
  229.   return(0);
  230. }
  231. /*************************************************************
  232. Function semOff
  233.   if value of semp is 0 , add to 1 
  234.   if not return false 
  235. Parameters
  236. iSemId : handle of semp
  237. *************************************************************/
  238. int semUnlock(int iSemId)
  239.   int iRet;
  240.      
  241.   struct sembuf sembuf;
  242.   sembuf.sem_num=0;
  243.   sembuf.sem_op=1;
  244. /*sembuf.sem_flg=IPC_NOWAIT | SEM_UNDO ;*/
  245.   sembuf.sem_flg=0;
  246.   if(semop(iSemId,&sembuf,1)<0)
  247.  {
  248.    ShowMsg("sem unlock failed! errno=%d error=%sn",errno,strerror(errno));
  249.   return(SemUnlockFail);
  250.   }
  251.  
  252. /*iRet=semctl(iSemId,0,SETVAL,1);
  253.   if(iRet<0) return(SemSetValFail);*/
  254.   return(0);
  255. }
  256. /*************************************************************
  257. Function semRemove
  258.   remove semaphores 
  259. Parameters
  260. iSemId : handle of semp
  261. *************************************************************/
  262. int semRemove(int iSemId)
  263. {
  264.   int iRet;
  265.   iRet=semctl(iSemId,0,IPC_RMID,0);
  266.   if (iRet<0) {
  267.      ShowMsg("sem Remove Failed errno=%d error=%sn",errno,strerror(errno));
  268.      return(SemRemoveFail);
  269.   }
  270.   return(0);
  271. }
  272. int semGetVal(int iSemId)
  273. { int semval;
  274.   semval=semctl(iSemId,0,GETVAL,0);
  275.   return (semval);
  276. }
  277. int semSetVal(int  iSemId,int val)
  278. /*union semun semopt;
  279.   semopt.val=val;*/
  280.   semctl(iSemId,0,SETVAL,val);
  281. }
  282. int shmCreate(key_t key,int size)
  283. {
  284.   int iShmId;
  285.   
  286.   iShmId=shmget(key,size,IPC_CREAT | IPC_EXCL | QPERM);
  287.   if (iShmId<0) {
  288.      if (errno==EEXIST) {
  289.         ShowMsg("shm has exist! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  290.         iShmId=shmget(key,size,QPERM);
  291.         if (iShmId<0) 
  292.         {
  293.         ShowMsg("shm open failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  294.          return(ShmOpenFail);
  295.         }
  296.         return iShmId;
  297.      }
  298.         ShowMsg("shm create failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  299.      return ShmCreateFail;
  300.   };
  301.   return iShmId;
  302. }
  303. int shmOpen(key_t key,int size)  
  304. {
  305.   int iShmId;
  306.   if ((iShmId=shmget(key,size,QPERM))==-1) {
  307.      ShowMsg("shm open failed! key=%d errno=%d error=%sn",key,errno,strerror(errno));
  308.      return ShmOpenFail;
  309.   }
  310.   return iShmId;
  311. }
  312. int shmRemove(int iShmId)
  313. {
  314.   int iRet;
  315.   iRet=shmctl(iShmId,IPC_RMID,0);
  316.   if (iRet<0) {
  317.      ShowMsg("shm Remove Failed errno=%d error=%sn",errno,strerror(errno));
  318.      return(ShmRemoveFail);
  319.   }
  320.   return(0);
  321. }
  322. char *shmConnect(int iShmId)
  323. { char *addr;
  324.   addr=shmat(iShmId,0,0);
  325.   if (addr==NULL)
  326.   { 
  327.      ShowMsg("shm Connect Failed errno=%d error=%sn",errno,strerror(errno));
  328.      return(NULL);
  329.   }
  330.   return(addr);
  331. }
  332. int shmDisConnect(char *addr)
  333.   if (shmdt(addr)!=0)
  334.   { 
  335.      ShowMsg("shm DisConnect Failed errno=%d error=%sn",errno,strerror(errno));
  336.      return(ShmDisConnectF);
  337.   }
  338.   return(0);
  339. }