Exécuter des pipes en C [Résolu]

Signaler
Messages postés
3
Date d'inscription
jeudi 25 février 2021
Statut
Membre
Dernière intervention
26 février 2021
-
Messages postés
3
Date d'inscription
jeudi 25 février 2021
Statut
Membre
Dernière intervention
26 février 2021
-
Bonjour,

Il m'a été demandé d'effectuer deux exercices qui consistent à:

Écrire une fonction
void execute_pipe(char**argv1,char**argv2)
qui prend en argument deux tableaux de chaînes de caractères terminés par NULL, chaque tableau correspondant à une commande avec ses arguments. La fonction exécute les deux commandes en redirigeant la sortie de la première commande sur l’entrée de la seconde. Par exemple, le programme suivant :

int main(){
    char *argv1[]= {"ls", "-la", NULL};
    char *argv2[]= {"grep", "toto", NULL};
    execute_pipe(argv1, argv2);
    return0;
}


qui affichera quelque chose comme

-rw-r--r-- 1 gim users   17 2010-10-08 18:10 toto


et

Écrire une fonction
void execute_pipes(char***argvs)
qui permet de chaîner plusieurs commandes. La sortie de la première est redirigée vers l’entrée de la seconde et ainsi de suite.
Exemple :

int main(){
    char*argv1[]= {"ls", "-la", NULL};
    char*argv2[]= {"grep", "toto", NULL};
    char*argv3[]= {"tr", "a-z", "A-Z", NULL};
    char**argvs[]= {argv1, argv2, argv3,NULL};
    execute_tubes(argvs);
    return0;
}


J'ai à ma disposition ce code ci-dessous pour m'aider à la réalisation de l'exercice:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "utils.h"

void
panic(char *file, int line, char *msg)
{
    fprintf(stderr, "%s:%d: %s\n",
            file, line, msg);
    exit(1);
}

void
handle_error(int rc, char *file, int line, char *msg)
{
    if (rc < 0) {
        fprintf(stderr, "%s:%d: %s: %s\n",
                file, line, msg, strerror(errno));
        exit(1);
    }
}

ssize_t
write_all(int fd, const void *buf, size_t count)
{
    const char *charbuf = buf;
    size_t buf_div = 0;
    while (buf_div < count) {
        int rc = write(fd, charbuf + buf_div,
                       count - buf_div);
        if (rc < 0) {
            return -1;
        }
        buf_div += rc;
    }
    return buf_div;
}

ssize_t
read_all(int fd, void *buf, size_t count)
{
    char *charbuf = buf;
    size_t buf_div = 0;
    while (buf_div < count) {
        int rc = read(fd, charbuf + buf_div, count - buf_div);
        if (rc < 0) {
            return -1;
        }
        if (rc == 0) {
            break;
        }
        buf_div += rc;
    }
    return buf_div;
}


Le problème est que je ne sais pas par où commencer.

2 réponses

Messages postés
29793
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
5 mai 2021
7 084
Bonjour

man pipe


Bon courage pour ton exercice :-)
Messages postés
3
Date d'inscription
jeudi 25 février 2021
Statut
Membre
Dernière intervention
26 février 2021

merci beaucoup pour ton aide :D