Untitled

 avatar
unknown
plain_text
9 months ago
1.4 kB
1
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/wait.h>

// פונקציה לעיבוד תהליך הילד
void child_process(const char *name, sem_t *sem) {
    sem_wait(sem); // מחכה לסמפור
    printf("%s\n", name);
    fflush(stdout);
    sem_post(sem); // משחרר את הסמפור
    exit(0); // מסיים את תהליך הילד
}

int main() {
    // יצירת הסמפור
    sem_t *sem = sem_open("/mysem", O_CREAT, 0644, 1);
    if (sem == SEM_FAILED) {
        perror("sem_open failed");
        exit(1);
    }

    // רשימת שמות התהליכים לפי סדר ההדפסה המבוקש
    const char *order[] = {"p4", "p3", "p5", "p1", "p6", "p2"};
    pid_t pids[6];

    // יצירת תהליכי הילד
    for (int i = 0; i < 6; i++) {
        pid_t pid = fork();
        if (pid < 0) {
            perror("fork failed");
            exit(1);
        } else if (pid == 0) { // תהליך ילד
            child_process(order[i], sem);
        } else {
            pids[i] = pid; // שמירת מזהי התהליכים של הילדים
        }
    }

    // ממתין לסיום כל תהליכי הילדים
    for (int i = 0; i < 6; i++) {
        waitpid(pids[i], NULL, 0);
    }

    // סוגר ומשחרר את הסמפור
    sem_close(sem);
    sem_unlink("/mysem");

    return 0;
}
Editor is loading...
Leave a Comment