Forum Programmation.c [résolu] execlp apt-cache ne fini jamais

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
29
fév.
2016

Bonjour.

Je jouais tranquillement avec execlp et apt-* pour voir si je pouvais faire yet another frontend, mais je m'aperçois que quand j'exécute apt-cache pkgnames, celui-ci ne se finit jamais quand j'ai au préalable redirigé sa sortie dans un pipe…

Voici un code minimal qui montre la chose:

#include <sys/wait.h>
#include <unistd.h>

int main()
{
  int pfd[2];
  if( -1 == pipe( pfd ) ) 
    return 1;

  pid_t p = fork();
  if( !p )
  {
    if( -1 == dup2( pfd[1], STDOUT_FILENO ) ) 
      return 1;

    execlp( "apt-cache", "apt-cache", "pkgnames" , NULL );
  }
  waitpid( p , NULL, 0 );
}

Après exécution, un ps -p $(pidof apt-cache) -o comm,stat donne ceci:

COMMAND         STAT
apt-cache       S+

Le process est en sommeil… reste a savoir pourquoi…

Commenter le dup2 (et le return lié, forcément) fait que le process se finit, rapidement, mais bien sûr tout est envoyé sur la sortie standard, ce qui n'est pas ce que je souhaite (je souhaite récupérer ces données pour mon programme).
Le même programme mais avec une autre commande ou une autre action (par exemple stats au lieu de pkgnames) passe sans problèmes…

À noter que dans le man, on peut lire des choses comme ça (au sujet de la façon d'afficher les dépendances par la commande showpkg): Pour connaître le sens de la fin de chaîne, il est préférable de consulter le code source d'APT.. J'aurais bien utilisé le nouveau apt, mais ce n'est pas fait pour être scripté de l'aveu du man.
Aller lire le code d'apt-cache ne m'a pas éclairé, il n'y a pas l'air d'y avoir de traitement particulier sur la sortie…

  • # Je suppose que le tampon du pipe est rempli

    Posté par  . Évalué à 3. Dernière modification le 29 février 2016 à 21:24.

    et donc que le noyau bloque les nouvelles écritures en attendant que le pipe soit lu de l'autre côté.

    If  a  process  attempts  to read from an empty pipe, then read(2) will
    block until data is available.  If a process attempts  to  write  to  a
    full  pipe  (see below), then write(2) blocks until sufficient data has
    been read from the pipe to allow the write  to  complete.
     -- pipe(7)
    
    • [^] # Re: Je suppose que le tampon du pipe est rempli

      Posté par  . Évalué à 3.

      Et la je me sens con… effectivement, il y a une grosse quantité de données, contrairement aux autres tests rapides que j'ai fait, du coup le fils ne pouvais pas tout envoyer…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.