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

📄 product-consume.c

📁 一个生产者-消费者问题例子
💻 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 + -