1.思维导图
2.使用信号灯集完成三个进程的同步, A 进程输出字符 A , B 进程输出字符 B , C 进程输出字符 C ,要求输出结果为ABCABCABCABCABC
sem.h
#ifndef __SEM_H__
#define __SEM_H__
int create_sem(int semcount);
int P(int semid,int semno);
int V(int semid,int semno);
int delete_sem(int semid);
#endif
sem.c
#include <myhead.h>
//定义结构体类型
#include "sem.h"
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
//定义设置信号灯集中的灯的值函数
int set_semno_value(int semid,int semno)
{
int val;
printf("请输入第%d号灯的值:",semno);
scanf("%d",&val);
//定义一个共用体变量
union semun su;
su.val=val;
//调用控制函数
if(semctl(semid,semno,SETVAL,su)==-1)
{
perror("semctl error");
return -1;
}
}
//创建信号灯集并初始化,semcout表示灯的个数
int create_sem(int semcount)
{
//创建key值
key_t key=0;
if((key=ftok("/",'k'))==-1)
{
perror("ftok error");
return -1;
}
//通过key值创建信号灯集
int semid =0;
if((semid =semget(key,semcount,IPC_CREAT|IPC_EXCL|0664))==-1)
{
//对错误码进行判断,如果错误码为EEXIST
if(errno == EEXIST)
{
//说明信号灯集已经存在,直接打开即可
semid = semget(key,semcount,IPC_CREAT|0664);
return semid;
}
perror("semget error");
return -1;
}
//初始化信号灯集中的灯
for(int i=0;i<semcount;i++)
{
set_semno_value(semid,i);
}
//返回信号灯集的id
return semid;
}
int P(int semid,int semno)
{
//定义操作结构体
struct sembuf buf;
buf.sem_num =semno;//要操作的信号灯的编号
buf.sem_op = -1;//表示申请资源的操作
buf.sem_flg = 0;//阻塞申请资源
//执行申请资源操作
if((semop(semid,&buf,1))==-1)
{
perror("semop error");
return -1;
}
return 0;
}
//释放资源操作
int V(int semid,int semno)
{
struct sembuf buf;
buf.sem_num =semno;
buf.sem_op = 1;
buf.sem_flg = 0;
//执行释放资源操作
if((semop(semid,&buf,1))==-1)
{
perror("semop error");
return -1;
}
return 0;
}
//删除信号灯集
int delete_sem(int semid)
{
if(semctl(semid,0,IPC_RMID)==-1)
{
perror("semctl error");
return -1;
}
}
zuoye1.c
#include <myhead.h>
#include "sem.h"
int main(int argc, const char *argv[])
{
//创建信号灯集
int semid=create_sem(3);
//定义进程号
pid_t pid1=-1;
pid_t pid2=-1;
pid1=fork();
if(pid1==0)
{
while(1)
{
//等待信号灯资源
P(semid,0);
printf("A");
sleep(1);
//释放信号灯资源
V(semid,1);
}
}else if(pid1 >0)
{
pid2=fork();
if(pid2==0)
{
while(1)
{
P(semid,1);
printf("B");
sleep(1);
V(semid,2);
}
}else if(pid2>0)
{
while(1)
{
P(semid,2);
printf("C");
sleep(1);
V(semid,0);
}
}else
{
perror("fork error");
return -1;
}
}else
{
perror("fork error");
return -1;
}
return 0;
}