#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include "shared.h"
void P(int SemId, int SemNum)
{
struct sembuf sem;
sem.sem_num = SemNum;
sem.sem_op = -1;
sem.sem_flg = 0;
if ( semop(SemId, &sem, 1) < 0 )
{
perror("P failed.");
}
return;
}
void V(int SemId, int SemNum)
{
struct sembuf sem;
sem.sem_num = SemNum;
sem.sem_op = 1;
sem.sem_flg = 0;
if (semop(SemId, &sem, 1) < 0 )
{
perror("V failed.");
}
return;
}
int GetSem(void)
{
int SemId = semget(SEM_KEY_ALL, 3, IPC_CREAT | 0660);
if (SemId < 0)
{
perror("get semaphore failed.");
exit(1);
}
return SemId;
}
int InitSem(void)
{
int SemId = GetSem();
semctl(SemId, SEM_EMPTY, SETVAL, BUFFER_SIZE);
semctl(SemId, SEM_FULL, SETVAL, 0);
semctl(SemId, SEM_MUTEX, SETVAL, 1);
return SemId;
}
ShareMem * GetShareMem(void)
{
int shmid = shmget(SHARE_MEM_KEY, sizeof(ShareMem), 0777 | IPC_CREAT );
if ( shmid < 0 )
{
perror("get Shared memory failed.");
return NULL;
}
return (ShareMem *)shmat(shmid, 0, 0);
}
int GetBufferUsed(int SemId)
{
int n = semctl(SemId, SEM_FULL, GETVAL, 0);
if (n < 0)
{
perror("get used buffer number failed.");
}
return n;
}
评论0