--- rpl/src/instructions_s1.c 2019/02/17 08:59:39 1.103 +++ rpl/src/instructions_s1.c 2019/07/16 15:17:00 1.110 @@ -19,7 +19,7 @@ ================================================================================ */ - +#define DEBUG_ERREURS #include "rpl-conv.h" @@ -3372,10 +3372,10 @@ instruction_sto(struct_processus *s_etat ================================================================================ */ -struct +static struct { struct_processus *s_etat_processus; - struct_liste_chainee *stdin; + struct_liste_chainee *fd_stdin; int pipe_entree; volatile int erreur; } arguments_stdin; @@ -3395,7 +3395,7 @@ thread_stdin(void *argument) ptr = argument; - l_element_courant = (*ptr).stdin; + l_element_courant = (*ptr).fd_stdin; s_etat_processus = (*ptr).s_etat_processus; (*ptr).erreur = d_es; @@ -3454,12 +3454,16 @@ 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; @@ -3486,6 +3490,9 @@ instruction_syseval(struct_processus *s_ struct timespec attente; + struct timeval horodatage_final; + struct timeval horodatage_initial; + unsigned char *ptr; unsigned char *ptr2; unsigned char registre_autorisation_empilement_programme; @@ -3849,19 +3856,19 @@ instruction_syseval(struct_processus *s_ if (close(pipes_entree[1]) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; - return; + printf("%d\n",__LINE__); } if (close(pipes_sortie[0]) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; - return; + printf("%d\n",__LINE__); } if (close(pipes_erreur[0]) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; - return; + printf("%d\n",__LINE__); } if (pipes_entree[0] != STDIN_FILENO) @@ -3869,7 +3876,7 @@ instruction_syseval(struct_processus *s_ if (dup2(pipes_entree[0], STDIN_FILENO) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; - return; + printf("%d\n",__LINE__); } } @@ -3878,7 +3885,7 @@ instruction_syseval(struct_processus *s_ if (dup2(pipes_sortie[1], STDOUT_FILENO) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; - return; + printf("%d\n",__LINE__); } } @@ -3887,18 +3894,15 @@ instruction_syseval(struct_processus *s_ if (dup2(pipes_sortie[1], STDERR_FILENO) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; - return; + printf("%d\n",__LINE__); } } - if (nombre_arguments != 0) + if ((nombre_arguments != 0) && ((*s_etat_processus).erreur_systeme + == d_es)) { execvp(arguments[0], arguments); } - else - { - exit(EXIT_SUCCESS); - } /* * L'appel système execvp() a généré une erreur et n'a pu exécuter @@ -3927,6 +3931,17 @@ instruction_syseval(struct_processus *s_ write_atomic(s_etat_processus, pipes_erreur[1], " ", 1); close(pipes_erreur[1]); + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : erreur interne dans SYSEVAL [%d]\n", + (int) getpid()); + } + else + { + printf("+++System : SYSEVAL internal error [%d]\n", + (int) getpid()); + } + exit(EXIT_SUCCESS); } else @@ -3991,7 +4006,7 @@ instruction_syseval(struct_processus *s_ } arguments_stdin.s_etat_processus = s_etat_processus; - arguments_stdin.stdin = l_element_stdin; + arguments_stdin.fd_stdin = l_element_stdin; arguments_stdin.pipe_entree = pipes_entree[1]; if (pthread_create(&thread_stdin_tid, &attributs, thread_stdin, @@ -4031,9 +4046,9 @@ instruction_syseval(struct_processus *s_ return; } - while((ios = (int) read_atomic(s_etat_processus, + while((ios = (int) read_atomic_signal(s_etat_processus, pipes_sortie[0], &(tampon[pointeur]), - (size_t) longueur_lecture)) > 0) + (size_t) longueur_lecture)) >= 0) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) @@ -4067,6 +4082,54 @@ instruction_syseval(struct_processus *s_ (*s_etat_processus).erreur_systeme = d_es_processus; return; } + + 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); + } + + if ((fpipe = fdopen(pipes_sortie[0], "r")) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + etape = 1; + registre_ios = ios; + + while((ios = getc(fpipe)) != EOF) + { + if (etape == 1) + { + gettimeofday(&horodatage_final, NULL); + + // Si au bout de 10 secondes après le premier + // signal, il reste des données à lire, le processus + // est sans doute encore actif. On envoie donc + // un signal 9. + + if ((horodatage_final.tv_sec - + horodatage_initial.tv_sec) > 10) + { + etape = 2; + kill(pid, SIGKILL); + gettimeofday(&horodatage_initial, NULL); + } + } + } + + ios = registre_ios; + break; + } } # ifndef SEMAPHORES_NOMMES