1> 使用信号灯集实现,三个进程分别输出ABCABCABCABCABC
代码 :
test.c
#include<head.h>
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
//自定义函数给信号灯集的制定
int init_semnum_value(int semid , int semnum , int value)
{
//为semctl准备第四个参数,是给信号灯设置值
union semun s;
s.val = value;
if(semctl(semid,semnum,SETVAL,s) == -1)
{
perror("semctl");
return -1;
}
return 0;
}
int init_sem() //创建并初始化一个信号灯集
{
//1.创建key值
key_t key = ftok("./",'q');
if(key == -1 )
{
perror("ftok");
return -1;
}
//2.创建信号灯集
int semid = semget(key , 3 , IPC_CREAT | IPC_EXCL | 0664);
if(semid == -1)
{
//对错误码进行判断
if(errno == EEXIST)
{
//文件已经存在,直接打开即可
semid = semget(key,2,IPC_CREAT | 0664);
}
else
{
perror("semget");
return -1;
}
}
else
{
//3.初始化信号灯
init_semnum_value(semid,0,0);
init_semnum_value(semid,1,1);
init_semnum_value(semid,2,0);
}
return semid;
}
int P(int semid , int semnum) //申请semid信号灯集中的semnum号灯的资源
{
//定义设置灯的信息的结构体变量
struct sembuf buf;
buf.sem_num = semnum;
buf.sem_op = -1;
buf.sem_flg = 0;
//将semnum号灯的资源减1操作
if(semop(semid,&buf,1) == -1)
{
perror("P");
return -1;
}
return 0;
}
int V(int semid , int semnum) //释放semid信号灯集中的semnum号灯的资源
{
//定义设置灯的信息的结构体变量
struct sembuf buf;
buf.sem_num = semnum;
buf.sem_op = 1;
buf.sem_flg = 0;
//将semnum号灯的资源减1操作
if(semop(semid,&buf,1) == -1)
{
perror("P");
return -1;
}
return 0;
}
int sem_del(int semid) //删除信号灯集
{
if(semctl(semid , 0 , IPC_RMID , 0) == -1)
{
perror("semctl");
return -1;
}
return 0;
}
sem.h
#ifndef __SEM_H__
#define __SEM_H__
int init_sem(); //创建并初始化一个信号灯集
int P(int semid , int semnum); //申请semid信号灯集中的semnum号灯的资源
int V(int semid , int semnum); //释放semid信号灯集中的semnum号灯的资源
int sem_del(int semid); //删除信号灯集
#endif
1.c
#include <head.h>
#include"sem.h"
int main(int argc, const char *argv[])
{
int semid = init_sem();
if(semid == -1)
{
printf("信号灯创建失败\n");
return -1;
}
int num = 5;
while(num--)
{
P(semid,1);
sleep(3);
printf("A");
fflush(stdout);
V(semid,2);
}
return 0;
}
2.c
#include <head.h>
#include"sem.h"
int main(int argc, const char *argv[])
{
int semid = init_sem();
if(semid == -1)
{
printf("信号灯创建失败\n");
return -1;
}
int num = 5;
while(num--)
{
P(semid,2);
sleep(3);
printf("B");
fflush(stdout);
V(semid,0);
}
return 0;
}
3.c
#include <head.h>
#include"sem.h"
int main(int argc, const char *argv[])
{
int semid = init_sem();
if(semid == -1)
{
printf("信号灯创建失败\n");
return -1;
}
int num = 5;
while(num--)
{
P(semid,0);
sleep(3);
printf("C");
fflush(stdout);
V(semid,1);
}
return 0;
}
运行结果: