实现功能

给儿子和女儿吃,儿子只吃香蕉,女儿只吃苹果,
假定盘子里依次只能放入2个水果,设计程序实现儿子,
女儿吃水果的过程。

源代码

/* 功能:给儿子和女儿吃,儿子只吃香蕉,女儿只吃苹果, 假定盘子里依次只能放入2个水果,设计程序实现儿子, 女儿吃水果的过程。 时间:2019年12月02日 作者:幻竹涂 */
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <sys/stat.h>

typedef struct
{
    
	sem_t sem[3];
	pthread_mutex_t mutex;
	int fd;
	time_t start;
	pthread_t t1;
	pthread_t t2;
	pthread_t t3;
}DATA;
	
#define FIFO_PATH "/tmp/123"
#define RES_NUM 6

void* mum(void* arg)
{
   
	DATA* data = (DATA*)arg;
	
	puts("mum start...");
	//目标物品
	char* goods[] = {
   "apple ","banana","orange","tomato","patato"};
	int idx = -1;
	while(1)
	{
   
		
		sem_wait(&data->sem[0]); 
		pthread_mutex_lock(&data->mutex);
		idx = rand()%5;	//放入物品
		write(data->fd,goods[idx],strlen(goods[idx]));
		printf("mum set [%s] from selves\t",goods[idx]);

		idx = rand()%5;	//放入物品
		write(data->fd,goods[idx],strlen(goods[idx]));
		printf("mun set [%s] from selves\n",goods[idx]);

		pthread_mutex_unlock(&data->mutex);
		sem_post(&data->sem[1]);//启动线程grl();
		sleep(1);
	}
	return NULL;
}

void* grl(void* arg)
{
   
	DATA* data = (DATA*)arg;

	puts("grl start...");
	
	while(time(NULL)- data->start < 20)
	{
   
		
		sem_wait(&data->sem[1]);
		char buf[32] = {
   0};
		
		pthread_mutex_lock(&data->mutex);

		read(data->fd,buf,6);
		if(strcmp(buf,"apple ") == 0) //是否存在相同
			printf("\033[32m \t\tgril get [%s] from selves\n\033[0m",buf);
		write(data->fd,buf,strlen(buf));//再次放入
	
		read(data->fd,buf,6);  //是否存在相同
		if(strcmp(buf,"apple ") == 0) 
			printf("\033[33m \t\tgril get [%s] from selves\n\033[0m",buf); 
		write(data->fd,buf,strlen(buf));//再次放入
		
		pthread_mutex_unlock(&data->mutex);
		sem_post(&data->sem[2]); //启动线程son();
		sleep(1);
	}
	pthread_cancel(data->t1);
	pthread_cancel(data->t3);
	return NULL;
}

void* son(void* arg)
{
   
	DATA* data = (DATA*)arg;

	puts("son start...");
	
	while(1)
	{
   
	
		sem_wait(&data->sem[2]);
		char buf[32] = {
   0};
		pthread_mutex_lock(&data->mutex);

		read(data->fd,buf,6);
		if(strcmp(buf,"banana") == 0)
			printf("\033[36m \t\tson get [%s] from selves\n\033[0m",buf);
		
		read(data->fd,buf,6);
		if(strcmp(buf,"banana") == 0)
			printf("\033[34m \t\tson get [%s] from selves\n\033[0m",buf);
	
		pthread_mutex_unlock(&data->mutex);

		sem_post(&data->sem[0]);  //启动线程mum();
		sleep(1);
	}
	pthread_cancel(data->t1);
	pthread_cancel(data->t2);
	return NULL;
}  

int main()
{
   
	DATA data;
	data.start = time(NULL);
	srand(data.start);	//产生随机种子

	alarm(25);

	if(access(FIFO_PATH,F_OK) < 0)	//创建有名管道
	{
   
		if(mkfifo(FIFO_PATH,0666) < 0)
		{
   
			perror("mkfifo");
			exit(EXIT_FAILURE);
		}
	}

	data.fd = open(FIFO_PATH,O_RDWR); //打开有名管道
	
	sem_init(&data.sem[0],0,RES_NUM); //初始化信号
	sem_init(&data.sem[1],0,0);		//
	sem_init(&data.sem[2],0,0);		//

	pthread_mutex_init(&data.mutex,NULL);//互锁

	pthread_create(&data.t1,NULL,mum,&data); //创建线程
	pthread_create(&data.t2,NULL,grl,&data);
	pthread_create(&data.t3,NULL,son,&data);

	pthread_join(data.t1,NULL);//等待线程
	pthread_join(data.t2,NULL);
	pthread_join(data.t3,NULL);

	sem_destroy(&data.sem[0]); //回收信号
	sem_destroy(&data.sem[1]);

	pthread_mutex_destroy(&data.mutex);	//回收锁

	close(data.fd);	 //关闭有名管道
	unlink(FIFO_PATH);//回收有名管道

	return 0;
}



实现结果