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 benja . É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é.
[^] # Re: Je suppose que le tampon du pipe est rempli
Posté par freem . É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.