CodSOTeorie#1

5. Completați următoarea secvență de cod astfel încât P1 trimite un semnal SIGUSR1 lui P2, la primirea semnalului P2 va trimite un mesaj prin pipe către P3:
mail@pastecode.io avatar
unknown
c_cpp
a year ago
3.0 kB
1
Indexable
Never
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

int main() {
    int p1_to_p2[2];  // Pipe de la P1 la P2
    int p2_to_p3[2];  // Pipe de la P2 la P3

    // Creare pipe-uri
    if (pipe(p1_to_p2) == -1 || pipe(p2_to_p3) == -1) {
        perror("Eroare la crearea pipe-urilor");
        exit(EXIT_FAILURE);
    }

    pid_t p1, p2, p3;

    p1 = fork();

    if (p1 < 0) {
        perror("Eroare la fork()");
        exit(EXIT_FAILURE);
    } else if (p1 == 0) {
        // P1

        close(p1_to_p2[0]);  // P1 nu va citi din pipe-ul de la P2

        // Trimite semnalul SIGUSR1 către P2
        kill(getppid(), SIGUSR1);

        printf("P1 a trimis semnalul SIGUSR1 către P2\n");

        close(p1_to_p2[1]);  // P1 nu va scrie în pipe-ul către P2

        exit(EXIT_SUCCESS);
    } else {
        p2 = fork();

        if (p2 < 0) {
            perror("Eroare la fork()");
            exit(EXIT_FAILURE);
        } else if (p2 == 0) {
            // P2

            close(p1_to_p2[1]);  // P2 nu va scrie în pipe-ul de la P1

            // Așteaptă semnalul SIGUSR1 de la P1
            pause();

            printf("P2 a primit semnalul SIGUSR1 de la P1\n");

            close(p2_to_p3[0]);  // P2 nu va citi din pipe-ul către P3

            // Trimite mesaj către P3 prin pipe
            char message[] = "Mesaj de la P2 către P3";
            write(p2_to_p3[1], message, sizeof(message));

            printf("P2 a trimis mesajul către P3\n");

            close(p2_to_p3[1]);  // P2 nu va scrie în pipe-ul către P3

            exit(EXIT_SUCCESS);
        } else {
            p3 = fork();

            if (p3 < 0) {
                perror("Eroare la fork()");
                exit(EXIT_FAILURE);
            } else if (p3 == 0) {
                // P3

                close(p2_to_p3[1]);  // P3 nu va scrie în pipe-ul de la P2

                char message[100];

                // Citește mesajul de la P2 prin pipe
                read(p2_to_p3[0], message, sizeof(message));

                printf("P3 a primit mesajul: %s\n", message);

                close(p2_to_p3[0]);  // P3 nu va citi din pipe-ul către P2

                exit(EXIT_SUCCESS);
            } else {
                // Procesul părinte

                close(p1_to_p2[0]);  // Părintele nu va citi din pipe-ul de la P1
                close(p1_to_p2[1]);  // Părintele nu va scrie în pipe-ul către P2
                close(p2_to_p3[0]);  // Părintele nu va citi din pipe-ul de la P2
                close(p2_to_p3[1]);  // Părintele nu va scrie în pipe-ul către P3

                // Așteaptă ca toți copiii să se termine
                wait(NULL);
                wait(NULL);
                wait(NULL);

                exit(EXIT_SUCCESS);
            }
        }
    }

  return 0;
}