Diff for /rpl/src/instructions_s1.c between versions 1.103 and 1.121

version 1.103, 2019/02/17 08:59:39 version 1.121, 2023/08/07 17:42:57
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.31    RPL/2 (R) version 4.1.35
   Copyright (C) 1989-2019 Dr. BERTRAND Joël    Copyright (C) 1989-2023 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 3372  instruction_sto(struct_processus *s_etat Line 3372  instruction_sto(struct_processus *s_etat
 ================================================================================  ================================================================================
 */  */
   
 struct  static struct
 {  {
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
     struct_liste_chainee    *stdin;      struct_liste_chainee    *fd_stdin;
     int                     pipe_entree;      int                     pipe_entree;
     volatile int            erreur;      volatile int            erreur;
 } arguments_stdin;  } arguments_stdin;
Line 3395  thread_stdin(void *argument) Line 3395  thread_stdin(void *argument)
   
     ptr = argument;      ptr = argument;
   
     l_element_courant = (*ptr).stdin;      l_element_courant = (*ptr).fd_stdin;
     s_etat_processus = (*ptr).s_etat_processus;      s_etat_processus = (*ptr).s_etat_processus;
     (*ptr).erreur = d_es;      (*ptr).erreur = d_es;
   
Line 3460  instruction_syseval(struct_processus *s_ Line 3460  instruction_syseval(struct_processus *s_
     int                         pipes_sortie[2];      int                         pipes_sortie[2];
     int                         status;      int                         status;
   
       file                        *fpipe;
   
     logical1                    drapeau_fin;      logical1                    drapeau_fin;
     logical1                    presence_stdin;      logical1                    presence_stdin;
       logical1                    processus_tue;
   
     long                        i;      long                        i;
     long                        nombre_arguments;      long                        nombre_arguments;
Line 3481  instruction_syseval(struct_processus *s_ Line 3484  instruction_syseval(struct_processus *s_
     struct_objet                *s_objet_resultat;      struct_objet                *s_objet_resultat;
     struct_objet                *s_objet_temporaire;      struct_objet                *s_objet_temporaire;
   
       struct pollfd               fds;
   
     struct sigaction            action_courante;      struct sigaction            action_courante;
     struct sigaction            action_passee;      struct sigaction            action_passee;
   
     struct timespec             attente;      struct timespec             attente;
   
       struct timeval              horodatage_final;
       struct timeval              horodatage_initial;
   
     unsigned char               *ptr;      unsigned char               *ptr;
     unsigned char               *ptr2;      unsigned char               *ptr2;
     unsigned char               registre_autorisation_empilement_programme;      unsigned char               registre_autorisation_empilement_programme;
Line 3658  instruction_syseval(struct_processus *s_ Line 3666  instruction_syseval(struct_processus *s_
                         .instruction_courante;                          .instruction_courante;
   
                 /*                  /*
                  * S'il y a des guillemets en début de chaîne, il y en                   * S'il y a des guillemets ou une apostrophe en début de
                  * a aussi à la fin de la chaîne et on les ôte. Les                   * chaîne, il y en * a aussi à la fin de la chaîne et on les
                  * guillements intermédiaires sont protégés par une                   * ôte. Les guillements intermédiaires sont protégés par une
                  * séquence d'échappement qui est enlevée.                   * séquence d'échappement qui est enlevée.
                  */                   */
   
                 if ((*s_etat_processus).instruction_courante[0] == '"')                  if (((*s_etat_processus).instruction_courante[0] == '"') ||
                           ((*s_etat_processus).instruction_courante[0] == '\''))
                 {                  {
                     if (strlen((*s_etat_processus).instruction_courante) >= 2)                      if (strlen((*s_etat_processus).instruction_courante) >= 2)
                     {                      {
Line 3849  instruction_syseval(struct_processus *s_ Line 3858  instruction_syseval(struct_processus *s_
             if (close(pipes_entree[1]) != 0)              if (close(pipes_entree[1]) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  printf("%d\n",__LINE__);
             }              }
   
             if (close(pipes_sortie[0]) != 0)              if (close(pipes_sortie[0]) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  printf("%d\n",__LINE__);
             }              }
   
             if (close(pipes_erreur[0]) != 0)              if (close(pipes_erreur[0]) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  printf("%d\n",__LINE__);
             }              }
   
             if (pipes_entree[0] != STDIN_FILENO)              if (pipes_entree[0] != STDIN_FILENO)
Line 3869  instruction_syseval(struct_processus *s_ Line 3878  instruction_syseval(struct_processus *s_
                 if (dup2(pipes_entree[0], STDIN_FILENO) == -1)                  if (dup2(pipes_entree[0], STDIN_FILENO) == -1)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                      printf("%d\n",__LINE__);
                 }                  }
             }              }
   
Line 3878  instruction_syseval(struct_processus *s_ Line 3887  instruction_syseval(struct_processus *s_
                 if (dup2(pipes_sortie[1], STDOUT_FILENO) == -1)                  if (dup2(pipes_sortie[1], STDOUT_FILENO) == -1)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                      printf("%d\n",__LINE__);
                 }                  }
             }              }
   
Line 3887  instruction_syseval(struct_processus *s_ Line 3896  instruction_syseval(struct_processus *s_
                 if (dup2(pipes_sortie[1], STDERR_FILENO) == -1)                  if (dup2(pipes_sortie[1], STDERR_FILENO) == -1)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*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);                  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               * L'appel système execvp() a généré une erreur et n'a pu exécuter
Line 3927  instruction_syseval(struct_processus *s_ Line 3933  instruction_syseval(struct_processus *s_
             write_atomic(s_etat_processus, pipes_erreur[1], " ", 1);              write_atomic(s_etat_processus, pipes_erreur[1], " ", 1);
             close(pipes_erreur[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);              exit(EXIT_SUCCESS);
         }          }
         else          else
Line 3991  instruction_syseval(struct_processus *s_ Line 4008  instruction_syseval(struct_processus *s_
                 }                  }
   
                 arguments_stdin.s_etat_processus = s_etat_processus;                  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];                  arguments_stdin.pipe_entree = pipes_entree[1];
   
                 if (pthread_create(&thread_stdin_tid, &attributs, thread_stdin,                  if (pthread_create(&thread_stdin_tid, &attributs, thread_stdin,
Line 4031  instruction_syseval(struct_processus *s_ Line 4048  instruction_syseval(struct_processus *s_
                 return;                  return;
             }              }
   
             while((ios = (int) read_atomic(s_etat_processus,              processus_tue = d_faux;
   
               while((ios = (int) read_atomic_signal(s_etat_processus,
                     pipes_sortie[0], &(tampon[pointeur]),                      pipes_sortie[0], &(tampon[pointeur]),
                     (size_t) longueur_lecture)) > 0)                      (size_t) longueur_lecture)) >= 0)
             {              {
                   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  #               ifndef SEMAPHORES_NOMMES
                     while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)                      while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #               else  #               else
Line 4067  instruction_syseval(struct_processus *s_ Line 4096  instruction_syseval(struct_processus *s_
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                      return;
                 }                  }
   
                   if ((*s_etat_processus).var_volatile_requete_arret == -1)
                   {
                       gettimeofday(&horodatage_initial, NULL);
                       kill(pid, SIGTERM);
   
                       if ((fpipe = fdopen(pipes_sortie[0], "r")) == NULL)
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_erreur_fichier;
                           return;
                       }
   
                       attente.tv_sec = 0;
                       attente.tv_nsec = GRANULARITE_us * 1000;
   
                       if (kill(pid, 0) == 0)
                       {
                           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
                               // 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)
                               {
                                   kill(pid, SIGKILL);
                                   gettimeofday(&horodatage_initial, NULL);
                                   processus_tue = d_vrai;
                               }
                           }
                       }
                   }
   
                   if (processus_tue == d_vrai)
                   {
                       break;
                   }
             }              }
   
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES

Removed from v.1.103  
changed lines
  Added in v.1.121


CVSweb interface <joel.bertrand@systella.fr>