2010-10-29 25 views
0

Je possède ce code:traitement du signal du clavier, l'ajout de paramètres à la fonction de gestionnaire callback (Ubuntu, intel)

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 

// Define the function to be called when ctrl-c (SIGINT) signal is sent to process 
void 
signal_callback_handler(int signum) 
{ 
    printf("Caught signal %d\n",signum); 
    // Cleanup and close up stuff here 

    // Terminate program 
    exit(signum); 
} 

int main() 
{ 
    // Register signal and signal handler 
    signal(SIGINT, signal_callback_handler); 

    while(1) 
    { 
     printf("Program processing stuff here.\n"); 
     sleep(1); 
    } 
    return EXIT_SUCCESS; 
} 

est-il un moyen de passer un argument supplémentaire dans la fonction de rappel? Quelque chose comme:

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 

// Define the function to be called when ctrl-c (SIGINT) signal is sent to process 
void 
signal_callback_handler(int signum, int k) 
{ 

    k++; // Changing value of k 
} 

int main() 
{ 
    int k = 0; 
    // Register signal and signal handler 
    signal(SIGINT, signal_callback_handler(k); 

    while(1) 
    { 
     printf("Program processing stuff here.\n"); 
     printf(" blah %d\n", k); 
     sleep(1); 
    } 
    return EXIT_SUCCESS; 
} 

Merci

Répondre

2

Non, il n'y a pas, et il y a très peu que vous devriez effectivement être faire dans un gestionnaire de signaux de toute façon.

Je règle généralement juste un drapeau et retourne, laissant le vrai code le manipuler à partir de là. Si vous voulez vraiment faire cela, vous pouvez rendre k un fichier statique au niveau du fichier afin que les deux main et le gestionnaire de signal (et toutes les autres fonctions du fichier) puissent y accéder, mais vous pouvez vouloir étudier la sécurité de cette option (si un gestionnaire de signal peut fonctionner pendant que le vrai programme utilise ou mettre à jour la valeur).

En d'autres termes, quelque chose comme:

static int k = 0; 

void signal_callback_handler(int signum) { 
    k++; // Changing value of k 
} 

int main() { 
    // Register signal and signal handler 
    signal(SIGINT, signal_callback_handler); 
    : : 
+0

en utilisant une variable générale? Pouvez-vous être plus précis s'il vous plaît? – mabounassif

+0

Bien sûr, @Mahmoud, voir ma mise à jour. – paxdiablo

+0

Même alors, la variable partagée doit être de type 'sig_atomic_t' ou vous devez soigneusement bloquer les signaux autour des sections critiques (par rapport à la mutation des données partagées entre le programme et le gestionnaire de signal) selon le cas. Voir ["Gestion des signaux"] (http://www.gnu.org/s/libc/manual/html_node/Atomic-Data-Access.html#Atomic-Data-Access) dans la documentation de la bibliothèque GNU C. –