IO进程线程 DAY8 作业

1.使用三个进程完成ABCABCABCABCABC的输出

①信号灯封装函数代码

#include 
//定义共用体类型
union semun 
{
	int val;
	struct semid_ds *buf;
	unsigned short *array;
	struct seminfo *__buf;
};

//初始化函数
int init_sem(int semid, int semno)
{
	int val = -1;
	printf("请输入标号为%d的灯的初始值:",semno);
	scanf("%d",&val);
	//getchar();            //吸收垃圾字符

	//对当前灯进行赋初始值
	//定义一个共用体变量
	union semun us;
	us.val = val;           //要赋的值
	if(semctl(semid,semno,SETVAL,us) == -1)
	{
		perror("set val error");
		return -1;
	}

	//成功返回0
	return 0;
}

//信号灯集的申请,初始化信号灯,并返回信号灯集的id
int create_sem(int semcount)
{
	//1.创建key值
	key_t key = ftok("/",'k');
	if(key == -1)
	{
		perror("ftok error");
		return -1;
	}

	//2.通过key值创建一个信号灯集
	int semid = semget(key, semcount , IPC_CREAT|IPC_EXCL|0664);
	if(semid == -1)
	{
		if(errno == EEXIST)
		{
			//说明信号灯集已经存在,无需创建直接打开即可
			semid = semget(key,semcount, IPC_CREAT);
			return semid;   //之后的进程打开该信号灯集只需返回id即可
		}
		perror("semget error");
		return -1;
	}

	//3.给信号灯集中的信号灯进行初始化操作
	for(int i= 0;i

②进程信号灯使用

#include 
#include "sem.h"
#define SIZE_PAGE 4096
int main(int argc, const char *argv[])
{
	//定义一个变量存放pid
	int pid1 = -1,pid2 = -1;

	//1.创建信号灯集
	int semid = create_sem(3);
	if(semid == -1)
	{
		perror("create error");
		return -1;
	}

	//创建子进程1
	pid1 = fork();

	if(pid1 == 0)
	{
		int count = 0;
		//子进程1
		while(count <5 ) 
		{	
			count++;
			P(semid,0);    //申请0号灯资源
			sleep(1);
			printf("B");
			fflush(stdout);
			V(semid,1);      //释放1号灯资源
		}

		//退出子进程1
		exit(EXIT_SUCCESS);
	}else if(pid1 > 0)
	{
		//创建子进程2
		pid2 = fork();

		if(pid2 == 0)
		{
			int count = 0;
			//子进程2
			while(count < 5)
			{
				count++;
				P(semid,1);    //申请1号灯资源
				sleep(1);
				printf("C\n");    
				V(semid,2);   //释放2号灯资源
			}

			//退出子进程2
			exit(EXIT_SUCCESS);
		}else if(pid2 > 0)
		{
			int count = 0;
			//父进程
			while(count < 5)
			{
				P(semid,2);   //申请2号灯资源
				sleep(1);
				printf("A");
				fflush(stdout);
				V(semid,0);  //释放0号灯资源
				count ++;
			}
			
			//回收子进程
			wait(NULL);
			wait(NULL);

			//删除信号灯资源
			del_sem(semid);

			return 0;

		}else
		{
			perror("fork pid2 error");
			return -1;
		}
	}else
	{
		perror("fork pid1 error");
		return -1;
	}

	return 0;
}

 ③头文件

#ifndef __SEM_H__
#define __SEM_H__
#include 
//信号灯集的申请,初始化信号灯,并返回信号灯集的id
int create_sem(int semcount);

//申请信号灯资源操作 P操作
int P(int semid, int semno);

//释放信号灯资源操作 V操作
int V(int semid, int semno);

//信号灯集的删除
int del_sem(int semid);

#endif 

实现效果 

IO进程线程 DAY8 作业_第1张图片

2.思维导图

 

你可能感兴趣的:(算法,数据结构)