Exemples Tubes
This commit is contained in:
51
Exemples/05-Signaux/main.c
Normal file
51
Exemples/05-Signaux/main.c
Normal 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);
|
||||
}
|
50
Exemples/05-Signaux/main2.c
Normal file
50
Exemples/05-Signaux/main2.c
Normal 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();
|
||||
}
|
27
Exemples/05-Signaux/signal-0.c
Normal file
27
Exemples/05-Signaux/signal-0.c
Normal 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");
|
||||
}
|
55
Exemples/05-Signaux/signal-1.c
Normal file
55
Exemples/05-Signaux/signal-1.c
Normal 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;
|
||||
}
|
||||
}
|
31
Exemples/05-Signaux/travailleur.c
Normal file
31
Exemples/05-Signaux/travailleur.c
Normal 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();
|
||||
}
|
38
Exemples/05-Signaux/travailleur2.c
Normal file
38
Exemples/05-Signaux/travailleur2.c
Normal 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();
|
||||
}
|
Reference in New Issue
Block a user