www.pudn.com > comm11111.rar > ipc.c
#include#include #include #include #include #include #include #include extern int errno; #include "ipc.h" /* typedef long key_t (IPC KEY) */ /* ipcs|ipcrm IPC msg|sem|shm IPC ID IPC KEY */ /* struct ipc_perm { key_t key; ushort uid; ushort gid; ushort cid; ushort cgid; ushort mode;} */ /********************************************************** Function msgCreate Create message queue Parameters : key : key which identify message queue Return : iMsgId : message queue id ***********************************************************/ int msgCreate(key_t key) { int iMsgId; iMsgId=msgget(key,IPC_CREAT | IPC_EXCL | QPERM); if (iMsgId<0) { if (errno==EEXIST) { ShowMsg("msg has exist! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); iMsgId=msgget(key,QPERM); if (iMsgId<0) { ShowMsg("msg open failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return(MsgOpenFail); } return iMsgId; } ShowMsg("msg create failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return MsgCreateFail; }; return iMsgId; } /********************************************************** Function msgOpen Open message queue , this queue must be existed . Parameters : key : key which identify message queue Return : iMsgId : message queue id ***********************************************************/ int msgOpen(key_t key) { int iMsgId; if ((iMsgId=msgget(key,QPERM))==-1) { ShowMsg("msg open failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return MsgOpenFail; } return iMsgId; } /********************************************************** Function msgStatus Output message queue status to a file Parameters : iMsgId : message queue id fpOut : output file handle ***********************************************************/ int msgStatus(int iMsgId) { struct msqid_ds msg_status; int i; if (msgctl(iMsgId,IPC_STAT,&msg_status) < 0 ) { return MsgStateFail; } /*printf("\nThe Msg Status is:"); */ ShowMsg("msg id=%i\nuid=%i\ngid=%i\nmode=%o\n" "msgnum=%i\nmsgqbytes=%i\ncbytes=%i\n" "lspid=%i\nlrpid=%i\n",iMsgId, msg_status.msg_perm.uid,msg_status.msg_perm.gid, msg_status.msg_perm.mode,msg_status.msg_qnum, msg_status.msg_qbytes,msg_status.msg_cbytes,msg_status.msg_lspid, msg_status.msg_lrpid); return(0); } /********************************************************** Function msgSendBuf Send info to message queue Parameters : iMsgId : message queue id lType : message type identify message info in the same queue pszInfo : info to be sent iInfoLen : length of info ***********************************************************/ int msgSend(int iMsgId , long lType , char *pszInfo , int iInfoLen) { Mesg mesg; if (iInfoLen>MaxMesgLen) { ShowMsg("msg len error! len=%d,maxlen=%d\n",iInfoLen,MaxMesgLen); return (MsgMesgLenBad);} mesg.MesgId=lType; memcpy(mesg.MesgText,pszInfo,iInfoLen); if (msgsnd(iMsgId,&mesg,iInfoLen,0)==-1) { ShowMsg("msg send failed! errno=%d error=%s\n",errno,strerror(errno)); return MsgSendFail; } return (0); } /********************************************************** Function msgRecvBuf Receive info from message queue Parameters : iMsgId : message queue id lType : message type identify message info in the same queue pszInfo : info buffer to be received iRecvLen : length of info iTimeOut : timeout , if =0 , nowait . ***********************************************************/ int msgRecv(int iMsgId , long *lType , char *pszInfo , int iExptLen) { Mesg mesg; int iRecvLen; if (iExptLen>MaxMesgLen) { ShowMsg("msg len error! len=%d,maxlen=%d\n",iExptLen,MaxMesgLen); return (MsgMesgLenBad);} /*if ((iRecvLen=msgrcv(iMsgId,&mesg,iExptLen,lType,IPC_NOWAIT))==-1) { return MsgRecvFail; }*/ if ((iRecvLen=msgrcv(iMsgId,&mesg,iExptLen,*lType,0))==-1) { ShowMsg("msg recv failed! errno=%d error=%s\n",errno,strerror(errno)); return MsgRecvFail; } memcpy(pszInfo,mesg.MesgText,iRecvLen); *lType=mesg.MesgId; return iRecvLen; } /********************************************************** Function msgRemove Remove message queue Parameters : iMsgId : message queue id ***********************************************************/ int msgRemove(int iMsgId) { if (msgctl(iMsgId,IPC_RMID,0) <0) { ShowMsg("msg remove failed! errno=%d error=%s\n",errno,strerror(errno)); return MsgRemoveFail; } return (0); } /************************************************************* Function semCreate Create one array semaphores Parameters key : key of identifier *************************************************************/ int semCreate(key_t key) { int iSemId,iRet; iSemId=semget(key,1,IPC_CREAT | IPC_EXCL | QPERM); if (iSemId<0) { if (errno==EEXIST) { ShowMsg("sem existed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); iSemId=semget(key,0,QPERM); if (iSemId<0) { ShowMsg("sem open failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return(SemOpenFail); } /************************************ iRet=semctl(iSemId,0,SETVAL,0); if(iRet<0) return(SemSetValFail); ************************************/ return(iSemId); } ShowMsg("sem create failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return(SemCreateFail); } iRet=semctl(iSemId,0,SETVAL,0); if(iRet<0) { ShowMsg("sem init 0 failed! key=%d sem=%d errno=%d error=%s\n",key,iSemId,errno,strerror(errno)); return(SemSetValFail); } return(iSemId); } /************************************************************* Function semOpen Open one array semaphores Parameters key : key of identifier *************************************************************/ int semOpen(key_t key) { int iSemId,iRet; iSemId=semget(key,0,QPERM); if (iSemId<0) { ShowMsg("sem open failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return(SemOpenFail); } /********************************* iRet=semctl(iSemId,0,SETVAL,0); if(iRet<0) return(SemSetValFail); **********************************/ return(iSemId); } /************************************************************* Function semOn if value of semp is 1 , set to 0 if not return false Parameters iSemId : handle of semp *************************************************************/ int semLock(int iSemId) { struct sembuf sembuf; sembuf.sem_num=0; sembuf.sem_op=-1; /*sembuf.sem_flg=IPC_NOWAIT | SEM_UNDO ;*/ sembuf.sem_flg=0; if(semop(iSemId,&sembuf,1)<0) { ShowMsg("sem lock failed! errno=%d error=%s\n",errno,strerror(errno)); return(SemLockFail); } return(0); } /************************************************************* Function semOff if value of semp is 0 , add to 1 if not return false Parameters iSemId : handle of semp *************************************************************/ int semUnlock(int iSemId) { int iRet; struct sembuf sembuf; sembuf.sem_num=0; sembuf.sem_op=1; /*sembuf.sem_flg=IPC_NOWAIT | SEM_UNDO ;*/ sembuf.sem_flg=0; if(semop(iSemId,&sembuf,1)<0) { ShowMsg("sem unlock failed! errno=%d error=%s\n",errno,strerror(errno)); return(SemUnlockFail); } /*iRet=semctl(iSemId,0,SETVAL,1); if(iRet<0) return(SemSetValFail);*/ return(0); } /************************************************************* Function semRemove remove semaphores Parameters iSemId : handle of semp *************************************************************/ int semRemove(int iSemId) { int iRet; iRet=semctl(iSemId,0,IPC_RMID,0); if (iRet<0) { ShowMsg("sem Remove Failed errno=%d error=%s\n",errno,strerror(errno)); return(SemRemoveFail); } return(0); } int semGetVal(int iSemId) { int semval; semval=semctl(iSemId,0,GETVAL,0); return (semval); } int semSetVal(int iSemId,int val) { /*union semun semopt; semopt.val=val;*/ semctl(iSemId,0,SETVAL,val); } int shmCreate(key_t key,int size) { int iShmId; iShmId=shmget(key,size,IPC_CREAT | IPC_EXCL | QPERM); if (iShmId<0) { if (errno==EEXIST) { ShowMsg("shm has exist! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); iShmId=shmget(key,size,QPERM); if (iShmId<0) { ShowMsg("shm open failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return(ShmOpenFail); } return iShmId; } ShowMsg("shm create failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return ShmCreateFail; }; return iShmId; } int shmOpen(key_t key,int size) { int iShmId; if ((iShmId=shmget(key,size,QPERM))==-1) { ShowMsg("shm open failed! key=%d errno=%d error=%s\n",key,errno,strerror(errno)); return ShmOpenFail; } return iShmId; } int shmRemove(int iShmId) { int iRet; iRet=shmctl(iShmId,IPC_RMID,0); if (iRet<0) { ShowMsg("shm Remove Failed errno=%d error=%s\n",errno,strerror(errno)); return(ShmRemoveFail); } return(0); } char *shmConnect(int iShmId) { char *addr; addr=shmat(iShmId,0,0); if (addr==NULL) { ShowMsg("shm Connect Failed errno=%d error=%s\n",errno,strerror(errno)); return(NULL); } return(addr); } int shmDisConnect(char *addr) { if (shmdt(addr)!=0) { ShowMsg("shm DisConnect Failed errno=%d error=%s\n",errno,strerror(errno)); return(ShmDisConnectF); } return(0); }