📄 product-consume.c
字号:
#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>#include<time.h>int semid1;int semid2;int semid3;void ctrl_c(int);int main(){ void(* old_handler)(int); old_handler=signal(SIGINT,ctrl_c); //重定义ctrl+c int nsems=1; int flags=0666; int ptime; int ctime; pid_t pid; struct sembuf buf; printf("\n\n"); printf("Now this is the producer's programe!\nAnd we have 5 rooms for buffer\n"); printf("\n\n"); semid1=semget(IPC_PRIVATE,nsems,flags); //建立三个信号量 semid2=semget(IPC_PRIVATE,nsems,flags); semid3=semget(IPC_PRIVATE,nsems,flags); if(semid1<0||semid2<0||semid3<0) { perror("semget"); exit(EXIT_FAILURE); } buf.sem_num=0; buf.sem_op=5; buf.sem_flg=0; if((semop(semid1,&buf,nsems))<0) //将semid1的semval定为5,即缓存区大小为5 { perror("semop"); exit(EXIT_FAILURE); } buf.sem_op=1; if((semop(semid2,&buf,nsems))<0) //将semid2的semval定为1,来表示控制缓存区读写的信号量 { perror("semop"); exit(EXIT_FAILURE); } system("ipcs -s"); printf("Now please enter the time by which the productor make a goods!\n\n"); //输入生产物品等待的时间,以便sleep()函数调用。 scanf("%d",&ptime); printf("Now please enter the time by which the consumer use a goods!\n\n"); //消费物品的时间 scanf("%d",&ctime); pid=fork(); if(pid>0) { while(1) { sleep(ptime); printf("Now I make a new goods!\n\n"); buf.sem_op=-1; semop(semid1,&buf,nsems); semop(semid2,&buf,nsems); printf("Now I add it to my buffer!\n\n"); buf.sem_op=1; semop(semid3,&buf,nsems); semop(semid2,&buf,nsems); } } else { while(1) { buf.sem_op=-1; semop(semid3,&buf,nsems); semop(semid2,&buf,nsems); printf("Now I take one\n\n"); buf.sem_op=1; semop(semid1,&buf,nsems); semop(semid2,&buf,nsems); sleep(ctime); printf("I have already use the goods!\n\n"); } }}void ctrl_c(int dump) //当按下ctrl+c时,先将程序中建立的三个信号量删除,然后再退出。{ if((semctl(semid1,0,IPC_RMID))<0) exit(EXIT_FAILURE); else if((semctl(semid2,0,IPC_RMID))<0) exit(EXIT_FAILURE); else if((semctl(semid3,0,IPC_RMID))<0) exit(EXIT_FAILURE); else system("ipcs -s"); exit(EXIT_SUCCESS);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -