#include "Mng.h" enum { MAGIC_KEY=326, }; #include static void Error(const char *fmt, ...) { va_list ap; va_start(ap,fmt); printf("Error:"); vprintf(fmt,ap); printf("\n"); fflush(stdout); va_end(ap); exit(1); } char *ShmAlloc(int nblk,int blksize) { enum { MAXID=4, MAXSHM=1024*1024 }; static int ShmId[MAXID]; static char *ShmBuf[MAXID]; //static int ShmSize[MAXID]; static int ShmOff[MAXID]; static int nShm=0; char *p=0; int i; //nblk == -1 means to clean up if(nblk==-1) { for(i=0;i MAXSHM) Error("Size too large %d > %d",nblk*blksize, MAXSHM); else // Really an allocation { int nb; for(i=0;i=0 && i< SemNum) Error("Invalid semaphore id %d",i); semopbuf.sem_num=semnum; semopbuf.sem_op=semval; //printf("<[%d]semaphore op#(%d):%d--",ID,i,n);fflush(stdout); if(semop(SemId,&semopbuf,1)==-1) Error("SemaOp failed on SEM#%d[%d](%s)",semnum,semval,strerror(errno)); //printf("--[%d]ok>\n",ID);fflush(stdout); } void SemInit(int n, int nMutex) { int i; if(n==-1) { if(SemId==-1) Error("Destroy before initialize!"); if(semctl(SemId,0,IPC_RMID,0)==-1) Error("Fail to remove semaphore(%s)",strerror(errno)); } else { if(nMutex > n) Error("Invalid parameters!"); if(SemId!=-1) Error("Multiply initializations of semaphore!"); SemId=semget(MAGIC_KEY, n, IPC_CREAT|IPC_EXCL|0600); if(SemId==-1) Error("Fail to get %d semaphores(%s)",n,strerror(errno)); for(i=0;i