Linux系统编程——使用semaphore实现进程同步

#include 
#include 
#include 
#include 
#include 
#include 

/**			-> 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系统,c语言)