Exemples Tubes

This commit is contained in:
2021-10-13 08:43:24 +02:00
parent 9abcc15483
commit 915ec95e88
23 changed files with 926 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void action1 (int signum); /* sur SIGUSR1 */
void action2 (int signum); /* sur SIGTERM */
void action3 (int signum);/* sur SIGUSR2 */
int pid;
int main(int argc, char *argv[]) {
pid = fork();
if (pid == 0) {
execl("travailleur", "travailleur", NULL);
}
printf("PID du père : %d\n", getpid());
signal(SIGUSR1, &action1);
signal(SIGUSR2, &action3);
signal(SIGTERM, &action2);
pause();
return EXIT_SUCCESS;
}
void action1 (int signum) {
/* Le fils a terminé son travail */
printf("Mon fils m'a envoyé SIGUSR1\n");
kill(pid, SIGUSR2);
pause();
kill(pid, SIGKILL);
}
void action2(int signum) {
/* on recoit un signal de l'exterieur pour forcer la sauvegarde
du fils */
printf("Le shell m'a envoyé SIGTERM\n");
kill(pid, SIGUSR2);
pause();
kill(pid, SIGKILL);
}
void action3(int signum) {
printf(" Recu SIGUSR2 du fils\n");
kill(pid, SIGKILL);
}

View File

@@ -0,0 +1,50 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void action1(int signum);
void action2(int signum);
void action3(int signum);
pid_t pid;
int main(int argc, char *argv[]) {
printf("Mon PID de pere : %d\n", getpid());
signal(SIGUSR2, &action2);
pid = fork();
if (pid == 0) {
execl("travailleur2", "travailleur2", NULL);
}
signal(SIGUSR1, &action1);
signal(SIGTERM, &action3);
pause();
return EXIT_SUCCESS;
}
void action1(int signum) {
printf("Je tue mon fils\n");
kill(pid, SIGKILL);
}
void action2(int signum) {
printf("Mon fils a fini son travail\n");
kill(pid, SIGUSR2);
pause();
}
void action3(int signum) {
printf("Je force mon fils à la sauvegarde\n");
kill(pid, SIGUSR2);
pause();
}

View File

@@ -0,0 +1,27 @@
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void sighandler (int signum);
int main(int argc, char *argv[]) {
char buffer[256];
if (signal(SIGTERM, &sighandler) == SIG_ERR) {
printf("Ne peut pas manipuler le signal\n");
exit(1);
}
while (1) {
fgets(buffer, sizeof(buffer), stdin);
printf("Input : %s", buffer);
}
return EXIT_SUCCESS;
}
void sighandler (int signum) {
printf("Masquage du signal SIGTERM\n");
}

View File

@@ -0,0 +1,55 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define FOREVER for(;;)
static void action (int sig);
int main(int argc, char *argv[]) {
int i, pid, etat;
sig_t s1, s2;
s1 = signal(SIGUSR1, action);
s2 = signal(SIGUSR2, action);
if (( s1 == SIG_ERR) || (s2 == SIG_ERR)) {
perror("Erreur attachement signal");
exit(1);
}
if ((pid = fork()) == 0) {
pause();
kill(getppid(), SIGUSR1);
sleep(10);
}
else {
sleep(2);
kill(pid, SIGUSR2);
pause();
printf("Parent : Demande terminaison du fils\n");
fflush(stdout);
kill(pid, SIGTERM);
wait(&etat);
printf("Parent : fils terminé\n");
fflush(stdout);
}
return EXIT_SUCCESS;
}
static void action(int sig) {
switch (sig) {
case SIGUSR1 :
printf("Parent : signal SIGUSR1 recu\n");
fflush(stdout);
break;
case SIGUSR2 :
printf("Fils : signal SIGUSR2 recu\n");
fflush(stdout);
break;
default :
break;
}
}

View File

@@ -0,0 +1,31 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void action_sauvegarde(int signum);
int main(int argc, char *argv[]) {
signal(SIGUSR2, &action_sauvegarde);
/* Charger des données */
printf("Calcul\n");
sleep(10);
kill (getppid(), SIGUSR1);
pause();
return EXIT_SUCCESS;
}
void action_sauvegarde(int signum) {
printf("Sauvegarde\n");
sleep(1);
kill(getppid(), SIGUSR2);
pause();
}

View File

@@ -0,0 +1,38 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void action_sauvegarde(int signum);
int b;
int main(int argc, char *argv[]) {
signal(SIGUSR2, &action_sauvegarde);
/* charge des données */
/* fait un calcul */
b = 1;
printf("Je fais un calcul\n");
sleep (10);
b = 0;
kill (getppid(), SIGUSR2);
pause();
return EXIT_SUCCESS;
}
void action_sauvegarde(int signum) {
/* sauvegarde */
if (b==1) {
printf("Je sauvegarde donnée corrompue\n");
sleep(2);
} else {
printf("Je sauvegarde donnée ok\n");
sleep(2);
}
kill(getppid(), SIGUSR1);
pause();
}