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
5
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...