📄 semaphore.c
字号:
/************** * semaphore.c* **************/#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>//#include <semaphore.h>#include <errno.h>#include <sys/stat.h>#include <fcntl.h>#define PERMS S_IRUSR|S_IWUSR#define MAX_CANON 100void init_semaphore_struct(struct sembuf *sem, int semnum,int semop,int semflg){sem->sem_num=semnum;sem->sem_op=semop;sem->sem_flg=semflg;}int del_semaphore(int semid){#if 1return semctl(semid,0,IPC_RMID);#endif}int main(int argc,char **argv){ char buffer[MAX_CANON],*c; int i,n; int semid,semop_ret,status; pid_t childpid; struct sembuf semwait,semsignal; if((argc!=2)||((n=atoi(argv[1]))<1)) { fprintf(stderr,"Usage:%s number\n\a",argv[0]); exit(1); } if((semid=semget(IPC_PRIVATE,1,PERMS))==-1) { fprintf(stderr,"[%d]:Acess Semaphore Error:%s\n\a", getpid(),strerror(errno)); exit(1); }init_semaphore_struct(&semwait,0,-1,0);init_semaphore_struct(&semsignal,0,1,0);if(semop(semid,&semsignal,1)==-1) {fprintf(stderr,"[%d]:Increment Semaphore Error:%s\n\a",getpid(),strerror(errno));if(del_semaphore(semid)==-1) fprintf(stderr,"[%d]:Destroy Semaphore Error:%s\n\a", getpid(),strerror(errno));exit(1); }for(i=0;i<atoi(argv[1]);i++) if(childpid=fork()) break;sprintf(buffer,"[i=%d]-->[Process=%d]-->[Parent=%d]-->[Child=%d]\n",i,getpid(),getppid(),childpid);c=buffer;while(((semop_ret=semop(semid,&semwait,1))==-1)&&(errno==EINTR));if(semop_ret==-1) {fprintf(stderr,"[%d]:Decrement Semaphore Error:%s\n\a", getpid(),strerror(errno)); }else {while(*c!='\0')fputc(*c++,stderr);while(((semop_ret=semop(semid,&semsignal,1))==-1)&&(errno==EINTR));if(semop_ret==-1) fprintf(stderr,"[%d]:Increment Semaphore Error:%s\n\a", getpid(),strerror(errno)); }while((wait(&status)==-1)&&(errno==EINTR));if(i==1) if(del_semaphore(semid)==-1) fprintf(stderr,"[%d]:Destroy Semaphore Error:%s\n\a", getpid(),strerror(errno));exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -