• [^] # Re: Question ?

    Posté par . En réponse au message Implémentations de plusieurs pipes. Évalué à 1.

    je cherche à faire justement l'enchaînement d'enfants

    Ma suggestion serait de ne pas vouloir faire de l'enchaînement d'enfant dans le sens ou l'enfant s'occupe de lancer lui-même même la commande liée, car du coups ton enfant est obligé d'attendre lui-même le pid, ce qui t'impose de faire un double fork (et ainsi de suite pour chaque commande enchaînée), ça va devenir vite compliqué pour pouvoir gèrer correctement les redirections (i.e. dans cmd1|cmd2|cmd3, le stdout de cmd3 c'est celui du shell).

    En pseudo-code ça donnerait:

    tant que commande à lancer (1)
    avancer le scanner
    doit être pipée en sortie ?
    doit être pipiée en entrée (== précédent doit être pipé en sortie) ?
    (2)
    forker, pipe/duper les fds et/ou redirection (< ou > ?), exec
    ajouter pid à la liste d'attente
    fini
    tant que liste d'attente est non vide
    waitpid()
    pid est dans la liste d'attente, le retirer

    Je te suggèrais aussi de faire cela en deux temps, c'est-à-dire à la place du (2): créer une liste d'exécution ou chaque élément serait le tuple (in redir_spec, out redir_spec, command_argv) où redir_spec := pipe | file_redirection, ensuite tu parcours une fois la liste pour créer les pipes et/ou ouvrir les fichiers de redirections, et une seconde fois pour lancer les commandes (ou les deux d'un coups mais bon j'aime pas trop, c'est mon côté programmation fonctionnelle).