Salut un petit probleme signalé par un enseignant d'ici, il parait que
ce programme est un classique sous UNIX. ç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. Le programme effectue un saisie de
caractères et les compte, et les signaux unix, lorsque ça fonctionne
ctrl C fini le programme, lorsque ca ne fonctionne pas la saisie
continue malgres le ctrl C bien que le signal soit vu. Une idée ?
MANDRAKE 5.1
GCC-2.7.2.3.11
EGCS-1.0.2-8
glibc-2.0.7-19
/*****************************************************************************
* 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);
}
}