⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 semaphore.c

📁 这个资料非常不错
💻 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 + -