signal ctrl + d

signal ctrl + d - C - Programmation

Marsh Posté le 08-01-2005 à 13:53:25    

voila, je dois intercepter ctrl+d, mais je trouve absolument pas du tout a quoi ca correspond ?
 
j'ai eu beau googlé, pas moyen de trouvé ca. et sur ce meme forum, kkun adit, donc pas moyen de changer son comprtement ? pas de réponse ...
 
merci ! :)
 
edit: euh... precision je sais intercepter un signal, c juste le nom que je cherce... j'ai fait du more signal.h sous mon nux, pas moyen de trouver....


Message édité par meumeul le 08-01-2005 à 13:54:40
Reply

Marsh Posté le 08-01-2005 à 13:53:25   

Reply

Marsh Posté le 08-01-2005 à 13:56:36    

ctrl+d ça correspond à EOF :o

Reply

Marsh Posté le 08-01-2005 à 13:57:46    

oui j'ai vu sur un poste ici. mais le nom....


Message édité par meumeul le 08-01-2005 à 13:58:31
Reply

Marsh Posté le 08-01-2005 à 14:15:35    

meumeul a écrit :

oui j'ai vu sur un poste ici. mais le nom....


 
 
je sais pas  :sweat:

Reply

Marsh Posté le 08-01-2005 à 14:21:00    

et je trouve pas non plus ctrl+\
y'a pas une liste autre que signal.h et qui explique la combinaison de touche qui correspond ?

Reply

Marsh Posté le 08-01-2005 à 14:34:06    

CTRL-D c'est pas un signal, c'est juste EOF ?!
 
Tu confonds pas avec CTRL-C ? Ça ça interrompt ton programme généralement, et ça envoie le signal SIGINT. Les combinaisons de touches, c'est lié au shell...


Message édité par blurk le 08-01-2005 à 14:38:32
Reply

Marsh Posté le 08-01-2005 à 14:47:20    

Dans mon sujet :

Citation :

Le mini-shell agit de la sorte en boucle jusqu'à saisir exit ou recevoir la fin de fichier ctrl D.


comment je fais ca ? comment on sait si un shell a reuc la fin de fichier ?

Reply

Marsh Posté le 08-01-2005 à 14:56:02    

getchar (), fgets (), etc. et feof () renvoient EOF en fin de fichier.

Reply

Marsh Posté le 08-01-2005 à 15:04:59    

Tiens vla un bout de programme à étudier pour toi, ca devrait t'aider à comprendre comment on intercepte un signal ;)
 
 

Code :
  1. /***
  2. *
  3. * Programme qui reçoit 5 CTRL-C avant de se stopper
  4. *
  5. *
  6. ***/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <signal.h>
  10. void Recuperation(int sig)
  11. {
  12.     static int compt = 0;
  13.     switch (sig) {
  14.     case SIGSEGV: printf("Arrrrrgh, il s'en est fallu de peu\n" );
  15.         /* La seule chose que l'on peut faire ici est de terminer le
  16.          * programme puisqu'on ne sais pas reparer l'erreur. Un simple
  17.          * return provoquerait une boucle
  18.          */
  19.         exit(1);
  20.     case SIGINT:  if (++compt == 5) {
  21.             printf("J'en ai assez!!\n" );
  22.             exit(1);
  23.         }
  24.         else
  25.             printf("OK je recupere le signal SIGINT\n" );
  26.     }
  27. }
  28. int main()
  29. {
  30.     char t[1];
  31.     int i=0;
  32.     signal(SIGSEGV, Recuperation);
  33.     signal(SIGINT,  Recuperation);
  34.     printf("Taper 5 ^C pour arreter le programme ou return pour continuer\n" );
  35.     /* On met le programme en attente : attention, sleep() ne conviendrait pas
  36.      * ici (essayez, vous verrez et lisez la page du manuel de sleep (man 3
  37.      * sleep). */
  38.     getchar();
  39.     /* On provoque un SIGSEGV car on sort du tableau t */
  40.     while(1) t[i++] = '!';
  41. }


 
Sinon EOF n'est pas un signal et CTRL+\ c'est SIGABRT....


Message édité par Xavier_OM le 08-01-2005 à 15:08:26

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 08-01-2005 à 15:11:10    

oui j'ai compris ton exemple, car il fallait annuler le comportement par defaut de crtl + c. mais sortir d'une boucle lorsquon recoit ctrl+d je vois pas comment on fait. je fais des fgets pour recuperer mes commandes. si c ctrl+d, mon buffer issu de fgets contiendrait quoi ?

Reply

Marsh Posté le 08-01-2005 à 15:11:10   

Reply

Marsh Posté le 08-01-2005 à 15:13:28    

ben à moins que je me trompe, tu fais un :  
"tant que je lis un truc sur l'entrée standard { blabla }"
 
et le fait de taper ctrl+D te fera sortir de ce while.


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 08-01-2005 à 15:19:27    

Ouais je me suis trompé fgets ne renvoie pas EOF... Dans ce cas il faut utiliser feof (), qui ne renvoie pas EOF non plus mais une valeur non nulle en fin de fichier.
 
Je vais me coucher. ;)

Reply

Marsh Posté le 08-01-2005 à 15:39:31    

Xavier_OM a écrit :

ben à moins que je me trompe, tu fais un :  
"tant que je lis un truc sur l'entrée standard { blabla }"
 
et le fait de taper ctrl+D te fera sortir de ce while.


 
merci. c'était donc ca........  :cry:

Reply

Marsh Posté le 08-01-2005 à 17:52:59    

blurk a écrit :

Ouais je me suis trompé fgets ne renvoie pas EOF... Dans ce cas il faut utiliser feof (), qui ne renvoie pas EOF non plus mais une valeur non nulle en fin de fichier.


Non. Il faut utiliser la valeur retournée par fgets(). Si c'est NULL, c'est que la lecture a été interrompue. Le plus souvent, cette information suffit.


   while (fgets(...) != NULL)
   {
   }


Si on tient à en connaitre la cause, on utilise feof() et ferror() pour lever le doute entre fin de fichier (EOF) et erreur systeme (effacement, lock ...). Les valeurs retournées par ces fonctions ne sont valides que si la fin de lecture a été detectée.
 


   while (fgets(..., fp) != NULL)
   {
   }
 
   /* apres coup uniquement... */
   if (ferror (fp))
   {
      /* erreur de lecture */
      perror ("nom du fichier" );
   }
   else if (feof (fp))
   {
      /* fin normale du fichier */
   }
   else
   {
      /* cause inconnue */
   }
 


 
http://mapage.noos.fr/emdel/notes.htm#fichiers


Message édité par Emmanuel Delahaye le 08-01-2005 à 18:07:42

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-01-2005 à 13:30:37    

Pour ctrl-d, tu peux utiliser la fonction atexit qui te permet de lancer une fonction en quittant le programme. Ca marche avec un return dans le main, un exit n'importe ou... et un ctrl-d.
 
Sinon du cote de termios et avec tcgetattr et tcsetattr tu peux annuler l'envoi du EOF mais c'est un peu plus complique.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed