• # Petite review

    Posté par . En réponse au journal bout de code pour relancer une commande dans certaines conditions. Évalué à 4.

    Je ne suis pas un grand connaisseur du C et ça fait longtemps que je n'ai pas pratiqué.
    Mais lire du code c'est toujours amusant :)

    int run_cmd( unsigned int time, unsigned int tsleep, char** cmd )
    {
     sleep( tsleep );
     int status;
     switch( fork() )
     {
     case 0:
     alarm( time );
     execvp( *cmd, cmd );
     case -1:
     CHECK_ERR();
     break;
     default:
     break;
     }
     pid_t child = wait( &status );
     return child != -1 ? WEXITSTATUS( status ) : -1;
    }

    Il y a pleins de subtilité dans ce petit bout code. Faut voir que execvp() ne retourne jamais sauf en cas d'erreur où il positionne errno. Donc la macro CHECK_ERR(), va gérer les cas d'erreur de fork() (ce qui est évident) ou de execvp()` (ce qui est déjà plus subtile).

    La gestion du fils est hors du switch alors que sémantiquement elle devrait être dans le default (amha). Et on a du coup un truc qui est de genre :

    swicth(fork()) {
     case 0: // child
     case -1: // error
     default: // root process
    }

    Bien sûr ce n'est qu'un avis personnel qui est là pour ouvrir une discussion :)

    https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll