81 lines
1.4 KiB
C
81 lines
1.4 KiB
C
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
|
|
typedef int * sem;
|
|
|
|
sem sem_init() {
|
|
sem s = calloc(2, sizeof(int));
|
|
pipe(s);
|
|
return s;
|
|
}
|
|
|
|
void sem_lock(sem s) {
|
|
int tmp;
|
|
if (read(s[0], &tmp, 1)<0) exit(1);
|
|
}
|
|
|
|
void sem_multi_lock(sem s, int n) {
|
|
for (int i = 0; i < n; i++) sem_lock(s);
|
|
}
|
|
|
|
void sem_signal(sem s) {
|
|
if (write(s[1], "0", 1)<0) exit(1);
|
|
}
|
|
|
|
void A(sem sB, sem sC, sem sD) {
|
|
puts("A");
|
|
sem_signal(sB);
|
|
sem_signal(sC);
|
|
sem_signal(sD);
|
|
}
|
|
|
|
void single_proc(sem x, sem y, int N, char * name) {
|
|
sem_multi_lock(x, N);
|
|
puts(name);
|
|
sem_signal(y);
|
|
}
|
|
|
|
void C(sem sC, sem sE, sem sF) {
|
|
sem_lock(sC);
|
|
puts("C");
|
|
sem_signal(sE);
|
|
sem_signal(sF);
|
|
}
|
|
|
|
int main() {
|
|
sem sA, sB, sC, sD, sE, sF, sG, sH, sI;
|
|
sA = sem_init();
|
|
sB = sem_init();
|
|
sC = sem_init();
|
|
sD = sem_init();
|
|
sE = sem_init();
|
|
sF = sem_init();
|
|
sG = sem_init();
|
|
sH = sem_init();
|
|
sI = sem_init();
|
|
while(1) {
|
|
if (!fork()) {
|
|
A(sB,sC,sD);
|
|
} else if (!fork()) {
|
|
single_proc(sB, sI, 1, "B");
|
|
} else if (!fork()) {
|
|
C(sC, sE, sF);
|
|
} else if (!fork()) {
|
|
single_proc(sD, sH, 1, "D");
|
|
} else if (!fork()) {
|
|
single_proc(sE, sG, 1, "E");
|
|
} else if (!fork()) {
|
|
single_proc(sF, sG, 1, "F");
|
|
} else if (!fork()) {
|
|
single_proc(sG, sI, 2, "G");
|
|
} else if (!fork()) {
|
|
single_proc(sH, sI, 1, "H");
|
|
} else if (!fork()) {
|
|
single_proc(sI, sA, 3, "I");
|
|
}
|
|
sem_lock(sA);
|
|
sleep(5);
|
|
}
|
|
}
|