1. 创建通信
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
int __createSemset(int *pSid)
{
int fd;
key_t key;
if ((fd = open("semset", O_RDWR | O_CREAT, 0666)) == -1)
{
perror("open");
exit(-1);
}
if ((key=ftok("semset", 'a')) == -1)
{
perror("ftok");
exit(-1);
}
if ((*pSid = semget(key, 1, IPC_CREAT | 0666)) == -1)
{
perror("createSemset");
return -1;
}
if( -1==semctl(*pSid, 0, SETVAL, 1) )
{
perror("SETVAL");
exit(-1);
}
}
2. 构建P、V函数
int sem_p(int sid)
{
struct sembuf t_sem;
t_sem.sem_num = 0;
t_sem.sem_op = -1;
t_sem.sem_flg = 0;
if (semop(sid, &t_sem, 1) == -1)
{
perror("sem_p op failed");
return -1;
}
}
int sem_v(int sid)
{
struct sembuf t_sem;
t_sem.sem_num = 0;
t_sem.sem_op = 1;
//t_sem.sem_flg = SEM_UNDO;
t_sem.sem_flg = 0;
if (semop(sid, &t_sem, 1) == -1)
{
perror("sem_v op failed");
return -1;
}
}
3. 实例测试
int main(void)
{
int sid;
__createSemset(&sid);
pid_t t_pid = fork();
if (0 == t_pid)
{
while(1)
{
sem_p(sid);
printf("111111\n");
usleep(100);
printf("222222\n");
usleep(100);
printf("333333\n");
usleep(100);
printf("444444\n");
usleep(100);
printf("555555\n");
usleep(100);
sem_v(sid);
}
}
else
{
while(1)
{
sem_p(sid);
printf("aaaaa\n");
usleep(100);
printf("bbbbb\n");
usleep(100);
printf("cccccc\n");
usleep(100);
printf("dddddd\n");
usleep(100);
printf("eeeeee\n");
usleep(100);
sem_v(sid);
}
}
return 0;
}
4. 运行效果