2015-10-30 2 views
4

Je souhaite que mon programme dorme jusqu'à 10 secondes même si le signal est émis. Donc, j'ai essayé le programme suivant.Appel système interrompu C

Programme:

#include<stdio.h> 
#include<signal.h> 
#include<errno.h> 
int main() 
{ 
    printf("PID: %d\n",getpid()); 
    int unslept=10; 
    while(unslept>0){ 
     unslept=sleep(unslept); 
     if(errno==EINTR) 
      continue; 
    } 
    return 0; 
} 

Sortie:

$ ./a.out 
PID: 18935 
User defined signal 1 
$ 

Je pense que le programme ci-dessus exécutera 10 secondes, même le signal est interrompu. Je l'exeperiment comme, dans un terminal I exécuté ce programme. Et en utilisant un autre terminal en utilisant la commande kill, j'ai envoyé le signal SIGUSR1 à ce processus. Mais, le même problème se produit. Une fois le signal passé, le programme se termine. Donc, existe-t-il un moyen d'exécuter mon programme jusqu'à 10 secondes sans affecter aucun signal.

+0

Voulez-vous gérer ces signaux ou simplement les ignorer? –

+4

Si vous lisez [la page de manuel 'signal (7)'] (http://man7.org/linux/man-pages/man7/signal.7.html) vous verrez que l'action par défaut pour 'SIGUSR1' (et 'SIGUSR2') est de terminer le processus. –

+0

Veuillez lire une introduction sur les signaux. Il semble que vous ayez de la difficulté à comprendre comment fonctionnent les singals. – fuz

Répondre

1

Vous pouvez utiliser un mécanisme de gestion de signal. Enregistrez votre méthode qui gérera les signaux d'interruption et ignorez-la simplement dans votre fonction.

// signal handler 
    void my_function(int sig){ 
     //do nothing 
    } 

// register signal 
    signal(SIGNAL_ID, my_function); 
1

Vous pouvez ignorer le signal. Voir l'exemple ci-dessous, dans cet exemple, si le signal SIGUSR1 est interrompu, il ignore simplement le signal en utilisant SIG_IGN.

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

    int main(void) 
    { 
      if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) 
        perror("SIGUSR1"); 

      sleep(30); 
    } 
+1

N'oubliez pas que si vous ignorez un signal, les appels système cesseront d'être interrompus par le signal. Si vous voulez "ne rien faire" sur un signal mais être toujours interrompu, enregistrez un gestionnaire de signal vide à la place. – fuz

+0

Je pense que le temps qu'il va gérer le signal. cette fois aussi il sera interrompu. –

+0

Oui, mais lorsque vous ignorez un signal, il n'est pas géré et votre processus n'est jamais interrompu. – fuz