--- rpl/src/instructions_s1.c 2019/07/16 08:31:22 1.109 +++ rpl/src/instructions_s1.c 2019/10/31 15:40:19 1.114 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.31 + RPL/2 (R) version 4.1.32 Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/2. @@ -19,6 +19,7 @@ ================================================================================ */ + #define DEBUG_ERREURS #include "rpl-conv.h" @@ -3454,18 +3455,17 @@ instruction_syseval(struct_processus *s_ { char **arguments; - int etape; int ios; int pipes_entree[2]; int pipes_erreur[2]; int pipes_sortie[2]; - int registre_ios; int status; file *fpipe; logical1 drapeau_fin; logical1 presence_stdin; + logical1 processus_tue; long i; long nombre_arguments; @@ -3485,6 +3485,8 @@ instruction_syseval(struct_processus *s_ struct_objet *s_objet_resultat; struct_objet *s_objet_temporaire; + struct pollfd fds; + struct sigaction action_courante; struct sigaction action_passee; @@ -3876,7 +3878,7 @@ instruction_syseval(struct_processus *s_ if (dup2(pipes_entree[0], STDIN_FILENO) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; - printf("%d\n",__LINE__); + printf("%d\n",__LINE__); } } @@ -3885,7 +3887,7 @@ instruction_syseval(struct_processus *s_ if (dup2(pipes_sortie[1], STDOUT_FILENO) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; - printf("%d\n",__LINE__); + printf("%d\n",__LINE__); } } @@ -3894,7 +3896,7 @@ instruction_syseval(struct_processus *s_ if (dup2(pipes_sortie[1], STDERR_FILENO) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; - printf("%d\n",__LINE__); + printf("%d\n",__LINE__); } } @@ -4046,11 +4048,22 @@ instruction_syseval(struct_processus *s_ return; } + processus_tue = d_faux; + while((ios = (int) read_atomic_signal(s_etat_processus, pipes_sortie[0], &(tampon[pointeur]), (size_t) longueur_lecture)) >= 0) { -uprintf("lecture\n"); + if ((ios == 0) && ((*s_etat_processus) + .var_volatile_requete_arret == 0)) + { + // Correspond à un buffer vide en l'absence + // d'interruption. On ne boucle pas, il n'y a rien à + // lire. + + break; + } + # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -4087,15 +4100,7 @@ uprintf("lecture\n"); if ((*s_etat_processus).var_volatile_requete_arret == -1) { gettimeofday(&horodatage_initial, NULL); - - if ((*s_etat_processus).var_volatile_alarme == -1) - { - kill(pid, SIGKILL); - } - else - { - kill(pid, SIGTERM); - } + kill(pid, SIGTERM); if ((fpipe = fdopen(pipes_sortie[0], "r")) == NULL) { @@ -4104,13 +4109,28 @@ uprintf("lecture\n"); return; } - etape = 1; - registre_ios = ios; + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; - while((ios = getc(fpipe)) != EOF) + if (kill(pid, 0) == 0) { - if (etape == 1) + while(feof(fpipe) == 0) { + fds.fd = pipes_sortie[0]; + fds.events = POLLIN; + + if (poll(&fds, 1, 0) > 0) + { + getc(fpipe); + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + } + else + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + gettimeofday(&horodatage_final, NULL); // Si au bout de 10 secondes après le premier @@ -4121,14 +4141,16 @@ uprintf("lecture\n"); if ((horodatage_final.tv_sec - horodatage_initial.tv_sec) > 10) { - etape = 2; kill(pid, SIGKILL); gettimeofday(&horodatage_initial, NULL); + processus_tue = d_vrai; } } } + } - ios = registre_ios; + if (processus_tue == d_vrai) + { break; } }