#include #include #include 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); } }