-
Notifications
You must be signed in to change notification settings - Fork 0
/
fonction.c
109 lines (90 loc) · 2.34 KB
/
fonction.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#define DEBUG 1
typedef struct
{
int o;
int op1;
int op2;
}Parametres;
//Structure sauvegarder en zone de mémoire partagé
typedef struct
{
int PointSauvegarde;
int taille;
Parametres info;
}infoAppli;
infoAppli zmp;
int *adrrZmp;
int initSurveillance(void *param)
{
// Tirage de clé
key_t cle ;
if((cle=ftok("watchdog.c", 'A'))==-1)
{
printf("Erreur 01 (initsurveillance): ftok\n");
exit(-1);
}
//Ouverture de la zone de mémoire partagée
int id;
if((id=shmget(cle, sizeof(infoAppli) , 0))==-1)
{
printf("Erreur 02 (initSurveillance) : shmget\n");
exit(-1);
}
//Attachement de la zone de mémoire partagée
if((adrrZmp=shmat(id, NULL, 0))==(void*)-1)
{
printf("Erreur 03 (initSurveillance) : shmat\n");
exit(-1);
}
//mise à jour des information dans la structure local
zmp.PointSauvegarde=((infoAppli*)adrrZmp)->PointSauvegarde;
zmp.taille=((infoAppli*)adrrZmp)->taille;
zmp.info=((infoAppli*)adrrZmp)->info;
//Mise à jour des paramètres
if(zmp.PointSauvegarde!=0)
{
//mise à jour des paramètres nécessaire pour l'exécution de l'application à surveiller
memcpy(param, &zmp.info, zmp.taille);
//DEBUG : tests
if(DEBUG==1) printf("DEBUG : test 3, point de sauvegarde reprit=%d\n",zmp.PointSauvegarde);
return zmp.PointSauvegarde;
}
else
{
return 0;
}
}
void pointReprise(int num , void *param, int taille) //taille correspond à taille des paramètres à sauvegarder et param adresse des donné à sauvegarder
{
//Vérification taille des éléments
if(taille > sizeof(Parametres))
{
printf("Erreur 01 (pointReprise) : Taille max dépasser\n");
zmp.PointSauvegarde=-1;
memcpy(adrrZmp, &zmp, sizeof(infoAppli));
exit(-1);
}
//sauvegarde des information dans la structure local
memcpy(&zmp.info, param, taille);
zmp.PointSauvegarde=num;
zmp.taille=taille;
//DEBUG : tests
if(DEBUG==1) printf("DEBUG : test 3, point de sauvegarde écrite=%d\n",num);
//sauvegarde des information dans la zone de mémoire partagé
memcpy(adrrZmp, &zmp, sizeof(infoAppli));
}
void finAppli()
{
zmp.PointSauvegarde=-2;
//mise à jour de la zone de mémoire partagé
*((infoAppli*)adrrZmp) = zmp ;
exit(0);
}