Re: probleme de C

Top Page

Reply to this message
Author: Edgar Bonet Orozco
Date:  
To: guilde
Subject: Re: probleme de C
Salut !

> [...] ça fonctionne correctement sur
> une Redhat 4.2 et la libc 5 visiblement ca ne fonctionne pas
> correctement avec une 5.1 et libc 6. J'ai essaye les 2 compilateurs gcc
> ou egcs sur plusieur machine.


Je ne crois pas que ça ait quoi que ce soit à voir avec le compilateur
ou la libc. read(2) est un appel système, donc entièrement géré par le
noyau.

> Le programme effectue un saisie de
> caractères et les compte, et les signaux unix, lorsque ça fonctionne
> ctrl C finit le programme, lorsque ca ne fonctionne pas la saisie
> continue malgres le ctrl C bien que le signal soit vu. Une idée ?


J'ai ajouté
    if (status_read == -1) perror("read");
juste après
    status_read = read(0,chaine,MAX_TAILLE);
Les résultats que j'ai sont :
    Linux 2.0.35/Sparc : read() retourne -1;
    HP-UX 9.07/HP 9000 : read() retourne -1;
    SunOS 4.1.3/Sparc  : read() continue.


Dans les deux premiers cas, la variable errno vaut EINTR (appel système
interrompu), le man de read(2) dit à propos de cette erreur :
       EINTR   read  a ete interrompu par un signal avant d'avoir
               eu le temps de lire quoi que ce soit.
Dans le cas de SunOS, l'appel système interrompu est automatiquement
relancé. Le man de read(2) renvoie à ce propos au man de sigvec(2) qui
dit :
     If a caught signal occurs during certain system  calls,  the
     call  is  restarted  by  default.  The call can be forced to
     terminate prematurely with an EINTR error return by  setting
     the   SV_INTERRUPT   bit  in  the  flags  for  that  signal.


Je laisse le programme ci dessous.

Edgar.

> /*****************************************************************************
> *    essai de time_out avec sigalarm()
> *      sans purge ..........................pour voir
> *    fichier to_read
> *************************************************************************/
> #define _POSIX_SOURCE
> #include <stdio.h>
> #include <unistd.h>
> #include <signal.h>
> #include <errno.h>

>
> #define MAX_TAILLE 40
>
>
> /**************************************************************************/
> /* signal catching handler
> *************************************************************************/
>     void inter(int signo)
>     {
>         int code_signal;

>
>     printf ("signal  catched: %d\n",signo);
>         code_signal = (int) signal(signo,inter);    /* catch again */ 
>     if (code_signal == -1)  perror("erreur set signal");
>     }

>
> /****************************************************************************/
> /* Try to read some characters from the keyboard
>  * then hit Ctrl C
>  * the signal catching handler should be activated   : IT IS
>  * the read should be complete                       : IT IS NOT

>
> ******************************************************************************/
>      main()
>     {    
>         int code_signal;        /* code retour demande de detournement*/
>         int status_read;    /* nombre de caractères lus           */
>     char chaine[MAX_TAILLE+1];  /* buffer de saisie              */

>
>
>         code_signal = (int) signal(SIGINT,inter);    /*  catch please */

>
>      if (code_signal == -1)
>             perror("erreur set signal");
>         else
>            {
>          status_read = read(0,chaine,MAX_TAILLE);   /* lancer lecture  */
>          printf("return from read %d \n",status_read);
>            }
>         }