#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <errno.h> #define SEMKEY 1000 main() { int iSemid; int ilRc; short ilArray[2]; /*创建信号灯并初始化*/ iSemid = semget(SEMKEY,1,IPC_CREAT|0600); if ( iSemid == -1 ) { printf("创建信号灯错误semget errno:%d:%s\n",errno,strerror(errno)); return(-1170); } ilArray[0] = 1; ilArray[1] = 1; ilRc = semctl(iSemid,1,SETALL,ilArray); if (ilRc==-1) { printf("信号灯初始化错误semctl SETALL errno:%d:%s\n",errno,strerror(errno)); return(-1170); } printf("start...\n"); Lock(iSemid,1); //锁 sleep(20); //等待20秒 printf("unlock...\n"); Unlock(iSemid,1); //解锁 printf("end...\n"); /*删除信号灯*/ ilRc = semctl(iSemid,0,IPC_RMID,0); if(ilRc < 0) { printf("删除信号灯出错 semctl(RM) errno:%d:%s\n",errno,strerror(errno)); return(-1); } return(0); } int Lock(int iSemid,int iNum) { struct sembuf slSembuf; int ilRc; slSembuf.sem_num = iNum - 1; slSembuf.sem_op = -1; slSembuf.sem_flg = SEM_UNDO; while(1){ ilRc = semop(iSemid,&slSembuf,1); if (ilRc == -1) { printf("信号灯操作出错semop P() errno:%d:%s\n",errno,strerror(errno)); if(errno == EINTR) continue; return(-1); } return(0); } } int Unlock(int iSemid,int iNum) { int ilRc; struct sembuf slSembuf; slSembuf.sem_num = iNum - 1; slSembuf.sem_op = 1; slSembuf.sem_flg = SEM_UNDO; ilRc = semop(iSemid,&slSembuf,1); if (ilRc == -1) { printf("semop P() errno:%d:%s\n",errno,strerror(errno)); return(-1); } return(0); }
#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <errno.h> #define SEMKEY 1000 main() { int iSemid; int ilRc; short ilArray[2]; /*创建信号灯并初始化*/ iSemid = semget(SEMKEY,1,IPC_EXCL); if ( iSemid == -1 ) { printf("创建信号灯错误semget errno:%d:%s\n",errno,strerror(errno)); return(-1170); } printf("semid=[%d]aaaaaaaaaaa\n",iSemid); Lock(iSemid,1); printf("bbbbbbbbbb \n"); //等20秒后带可以打印bbbbbbb Unlock(iSemid,1); return(0); } int Lock(int iSemid,int iNum) { struct sembuf slSembuf; int ilRc; slSembuf.sem_num = iNum - 1; slSembuf.sem_op = -1; slSembuf.sem_flg = SEM_UNDO; while(1){ ilRc = semop(iSemid,&slSembuf,1); if (ilRc == -1) { if(errno == EINTR) continue; printf("信号灯操作出错semop P() errno:%d:%s\n",errno,strerror(errno)); return(-1); } return(0); } } int Unlock(int iSemid,int iNum) { int ilRc; struct sembuf slSembuf; slSembuf.sem_num = iNum - 1; slSembuf.sem_op = 1; slSembuf.sem_flg = SEM_UNDO; ilRc = semop(iSemid,&slSembuf,1); if (ilRc == -1) { printf("semop P() errno:%d:%s\n",errno,strerror(errno)); return(-1); } return(0); }