probleme de C

トップ ページ

このメッセージに返信
著者: dominique Billard
日付:  
To: guilde@imag.fr
題目: probleme de C
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);
           }
        }