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:unknown
c_cpp
2 years ago
3.0 kB
4
Indexable
#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; }
Editor is loading...