#include "sem.h"
int main(int argc, const char *argv[])
{
int semid;
if((semid=init_sem())==-1)
{
perror("ftok");
return -1;
}
pid_t pid;
pid=fork();
if(pid<0)
{
perror("fork");
return -1;
}
else if(pid==0)
{
for(int i=0;i<5;i++)
{
p(semid,0);
printf("A\n");
V(semid,1);
}
exit(0);
}
else
{
pid_t pid1;
pid1=fork();
if(pid1>0)
{
for(int i=0;i<5;i++)
{
p(semid,2);
printf("C\n");
V(semid,0);
}
}
else if(pid1==0)
{
for(int i=0;i<5;i++)
{
p(semid,1);
printf("B\n");
V(semid,2);
}
exit(0);
}
else
{
perror("fork");
return -1;
}
}
wait(NULL);
wait(NULL);
sem_del(semid);
return 0;
}
#include "sem.h"
int init_semnum_value(int semid,int semnum,int value)
{
union semun s;
s.val=value;
if(semctl(semid,semnum,SETVAL,s)==-1)
{
perror("semctl");
return -1;
}
return 0;
}
int init_sem()
{
key_t key;
if((key=ftok("./",'p'))==-1)
{
perror("ftok");
return -1;
}
int semid;
if((semid=semget(key,3,IPC_CREAT|IPC_EXCL|0664))==-1)
{
if(errno==EEXIST)
{
semid=semget(key,3,IPC_CREAT|0664);
}
else
{
perror("semget");
return -1;
}
}
else
{
//自定义函数 初始化
init_semnum_value(semid,0,1);
init_semnum_value(semid,1,0);
init_semnum_value(semid,2,0);
}
return semid;
}
int p(int semid,int semnum)
{
//struct sembuf
struct sembuf buf;
buf.sem_num=semnum;
buf.sem_op=-1;
buf.sem_flg=SEM_UNDO;
if(semop(semid,&buf,1)==-1)
{
perror("semop");
return -1;
}
return 0;
}
int V(int semid,int semnum)
{
struct sembuf buf;
buf.sem_num=semnum;
buf.sem_op=1;
buf.sem_flg=SEM_UNDO;
if(semop(semid,&buf,1)==-1)
{
perror("semop");
return -1;
}
return 0;
}
int sem_del(int semid)
{
if(semctl(semid,0,IPC_RMID,0)==-1)
{
perror("semctl");
return -1;
}
}