题目:三个进程分别打印A,B,C,要求输出的结果必须是“ABCABC”顺序执行
设置三个信号量:
sem1:初始值设置为1,保证进程可以执行,对sem1执行P操作,进程3输出C后,对sem1进行V操作
sem2:初始值设为0,进程2执行后对sem2进行P操作,进程1输出A后对sem2进行V操作
sem3:初始值设为0,进程3执行后对sem3执行P操作,进程2输出B后对sem3执行V操作
sem.h
#pragma once
typedef union semun
{
int val;
}SemUn;
int GetSem(int key, int initval[],int n);
int DelSem(int semid);
int SemP(int semid,int index);
int SemV(int semid,int index);
sem.c
#include "sem.h"
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <unistd.h>
int GetSem(int key,int initval[], int n)
{
int semid = semget((key_t)key , 0, 0664);
if(semid == -1)
{
semid = semget((key_t)key, n, 0664 | IPC_CREAT);
if(semid == -1)
{
return -1;
}
int i = 0;
for(; i < n;++i)
{
SemUn data;
data.val = initval[i];
int res = semctl(semid, i, SETVAL, data);
if(res == -1)
{
DelSem(semid);
return -1;
}
}
}
return semid;
}
int SemP(int semid, int index)
{
struct sembuf buf;
buf.sem_num = index;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
int res = semop(semid, &buf, 1);
if(res == -1)
{
return -1;
}
return 0;
}
int SemV(int semid, int index)
{
struct sembuf buf;
buf.sem_num = index;
buf.sem_op = 1;
buf.sem_flg = SEM_UNDO;
int res = semop(semid, &buf, 1);
if(res == -1)
{
return -1;
}
return 0;
}
int DelSem(int semid)
{
int res = semctl(semid, 0, IPC_RMID);
if(res == -1)
{
return -1;
}
return 0;
}
1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include "sem.h"
int main()
{
srand((unsigned int)time(NULL));
int initval[] = {1, 0, 0};
int semid = GetSem(1234, initval,sizeof(initval)/sizeof(initval[0]));
assert(semid != -1);
int count = 0;
while(count < 5)
{
SemP(semid, 0);
printf("A");
fflush(stdout);
int n = rand() % 3;
sleep(n);
SemV(semid,1);
count ++;
}
exit(0);
}
2.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include "sem.h"
int main()
{
srand((unsigned int)time(NULL));
int initval[] = {1,0,0};
int semid = GetSem(1234, initval,sizeof(initval)/sizeof(initval[0]));
assert(semid != -1);
int count = 0;
while(count < 5)
{
SemP(semid, 1);
printf("B");
fflush(stdout);
int n = rand() % 3;
sleep(n);
SemV(semid,2);
count ++;
}
exit(0);
}
3.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include "sem.h"
int main()
{
srand((unsigned int)time(NULL));
int initval[] = {1,0,0};
int semid = GetSem(1234, initval,sizeof(initval)/sizeof(initval[0]));
assert(semid != -1);
int count = 0;
while(count < 5)
{
SemP(semid, 2);
printf("C");
fflush(stdout);
int n = rand() % 3;
sleep(n);
SemV(semid,0);
count ++;
}
exit(0);
}
执行结果: