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);
> }
> }