#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <semaphore.h>
/** -> C -> E ->
* A -> B F
* -> D ----->
*/
sem_t *sem_A;
sem_t *sem_B;
sem_t *sem_C;
sem_t *sem_D;
sem_t *sem_E;
sem_t *sem_F1;
sem_t *sem_F2;
void P(sem_t *sem) {
sem_wait(sem);
}
void V(sem_t *sem) {
sem_post(sem);
}
void task_A() {
P(sem_A);
printf("Start task A...\n");
sleep(rand()%5+1);
printf("Task A finished!\n");
V(sem_B);
}
void task_B() {
P(sem_B);
printf("Start task B...\n");
sleep(rand()%5+1);
printf("Task B finished!\n");
V(sem_C);
V(sem_D);
}
void task_C() {
P(sem_C);
printf("Start task C...\n");
sleep(rand()%5+1);
printf("Task C finished!\n");
V(sem_E);
}
void task_D() {
P(sem_D);
printf("Start task D...\n");
sleep(rand()%5+1);
printf("Task D finished!\n");
V(sem_F1);
}
void task_E() {
P(sem_E);
printf("Start task E...\n");
sleep(rand()%5+1);
printf("Task E finished!\n");
V(sem_F2);
}
void task_F() {
P(sem_F1);
P(sem_F2);
printf("Start task F...\n");
sleep(4);
printf("Task F finished!\n");
V(sem_F1);
V(sem_F2);
}
int main(int argc, char *argv[]) {
int pageSize = sysconf(_SC_PAGE_SIZE);
void *addr = mmap(NULL, pageSize * 1, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
sem_t *sems = (sem_t *)addr;
sem_A = &sems[0];
sem_B = &sems[1];
sem_C = &sems[2];
sem_D = &sems[3];
sem_E = &sems[4];
sem_F1 = &sems[5];
sem_F2 = &sems[6];
int i;
for (i = 0; i < 7; i++) {
sem_init(&sems[i], 1, 0);
}
V(sem_A);
if (0 == fork()) {
task_A();
_exit(0);
} else {
wait(NULL);
}
if (0 == fork()) {
task_B();
_exit(0);
} else {
wait(NULL);
}
if (0 == fork()) {
task_C();
_exit(0);
} else {
wait(NULL);
}
if (0 == fork()) {
task_D();
_exit(0);
} else {
wait(NULL);
}
if (0 == fork()) {
task_E();
_exit(0);
} else {
wait(NULL);
}
if (0 == fork()) {
task_F();
_exit(0);
} else {
wait(NULL);
}
printf("All task finished!\n");
exit(0);
}
Linux系统编程——使用semaphore实现进程同步
最新推荐文章于 2024-05-10 07:00:00 发布