Facile....Montre-nous un peu comment tu affiches ton "J'ai reçu SIGKILL".
Je ne mettrais ni le code complet (2 modules de 20 000 lignes), ni la création/ouverture des sockets, juste ce qu'il faut...
Tu fais une routine :
Dans une bibliothèque c'est mieux :-)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /* * Parametres : * <requete> : numero du descripteur de fichier * <fonction> : fonction appelee lors de la reception du signal systeme * * * Retour : 0 si tout va bien * < 0 il y a eu erreur * > 0 : il y a deja des caracteres a lire sur le socket. Dans ce * cas, on retourne le nobre de caracteres disponibles sans * passer en mode asynchrone. */ int InitialiserSocketAsynchrone(int requete,void (*fonction)() ) { pid_t pid; int retour; int bidon; /* *On passe en asynchrone *Obtenir le numero de ce processus pour pouvoir le refiler *a ioctl afin d'etre avise de tout changement sur le socket */ pid =getpid(); bidon = (int) pid; #ifndef LINUX retour = ioctl(requete,SIOCSPGRP,&bidon); #else retour = fcntl(requete,F_SETOWN,(long)bidon); #endif if ( retour < 0 ) return retour ; /* *Initialiser l'option asynchrone pour le socket */ #ifndef LINUX bidon = 1; retour = ioctl(requete,FIOASYNC,&bidon); #else bidon = O_ASYNC ; retour = fcntl(requete,F_SETFL,(long)bidon); #endif if ( retour < 0 ) return retour ; else { signal(SIGIO,fonction); return (0); } }
Et ensuite, ET dans le client ET dans le serveur tu mets :
Fait un kill sur l'un ou l'autre (kill -9) et regarde le numéro de signal reçu par l'autre....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 { ..... int iret, canal_in ; .... /* A l'endroit ou on va écouter le socket et attendre les évènements */ iret = InitialiserSocketAsynchrone( Canal_in, &Received_New_Request ); ....... } /* * R e c e i v e d _ N e w _ R e q u e s t * */ static void Received_New_Request ( int sig ) { /* Si dans serveur */ fprintf (stderr, "\n\nInterrupt %d received from client",sig); /* Si dans client */ fprintf (stderr, "\n\nInterrupt %d received from server",sig); /* --- Go get the number of the server concerned by this signal */ /* --- If interrupt provoked by temination of either ends, exits ---*/ if ( (sig == SIGKILL) || (sig == SIGTERM) || (sig == SIGQUIT) || (sig == SIGPIPE) || (sig == SIGSTOP) || (NumServer == -9999) ) { if ( DEBUG ) fprintf(stderr,"ONE TERMINATION SIGNAL WAS RECEIVED \n"); End_Of_Session(2); } }
Partager