Beh en fait, le prof nous a fait un programme de base et on doit le modifier. Ce programme est en langage C. Il faut gérer la redirection simple > et double >> ainsi que les messages d'erreurs.
Je te passe le code du prof, je pense que tu verras mieux.
Code C/C++ :
* exemple de creation et de transformation de processus */
/* REMARQUE IMPORTANTE :
Tous les echanges entre les differents processus se font en tenant
compte que le caractere '\n' termine toujours les messages */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include "tools.h"
#define LBUF 512
char buf[LBUF];
void trace(char * M)
{
printf("PID=%d PPID=%d : %s\n", getpid(), getppid(), M);
}
int main(int N, char *P[])
{
int pid1, pid2, p1[2], p2[2], p3[2], i, n;
/* creation des 3 pipes */
if (pipe(p1) == -1) perror("pipe no1");
if (pipe(p2) == -1) perror("pipe no2");
if (pipe(p3) == -1) perror("pipe no3");
#ifdef DEBUG
trace("Je suis le programme de depart !!");
#endif
if ((pid1 = fork()) == -1) { /* creation du 1er fils */
perror("Creation du fils no1");
exit(1);
}
if (pid1 == 0) { /* je suis dans le fils no 1 */
#ifdef DEBUG
trace("Je suis le fils no 1 !!");
#endif
/* le fils no 1 n'utilise que sortie de p1 et entree de p2 */
close(p1[1]);
close(p2[0]);
close(p3[0]);
close(p3[1]);
/* recuperation du message de mon pere */
if ((n=lireLigne(p1[0],buf,LBUF)) == -1) {
perror("Fils 1 - rien recu du pere !!");
exit(3);
}
for (i=0; i<n; i++)
if (islower((int)buf[i])) buf[i] = (char)toupper((int)buf[i]);
#ifdef DEBUG
printf("Fils 1 - resultat : <%s>\n", buf);
#endif
/* envoi du travail au fils no 2 */
write(p2[1],buf,n);
exit(0);
} else { /* je suis dans le pere */
#ifdef DEBUG
trace("Je suis le pere apres creation du 1er fils !!");
#endif
if ((pid2 = fork()) == -1) { /* creation du 2eme fils */
perror("Creation du fils no2");
exit(2);
}
if (pid2 == 0) { /* je suis dans le fils no 2 */
#ifdef DEBUG
trace("Je suis le fils no 2 !!");
#endif
/* le fils no 2 n'utilise que sortie de p2 et entree de p3 */
close(p2[1]);
close(p3[0]);
close(p1[0]);
close(p1[1]);
/* ce fils va se transformer pour executer le code de md5sum
qui, par defaut, lit les donnees sur stdin (0) et ecrit le resiltat
sur stdout (1). Donc on dupplique les pipes pour que cela coincide !
******************/
dup2(p2[0],0); /* redirection de la sortie de p2 vers stdin */
dup2(p3[1],1); /* redirection de l'entree de p3 vers stdout */
close(p2[0]);
close(p3[1]);
/* transformation du fils 2 pour executer le code de md5sum */
execlp("md5sum", "fils2", "-");
perror("execlp");
exit(4);
} else { /* je suis dans le pere */
#ifdef DEBUG
trace("Je suis le pere apres creation du 2eme fils !!");
#endif
/* le pere n'utilise que sortie de p3 et entree de p1 */
close(p3[1]);
close(p1[0]);
close(p2[0]);
close(p2[1]);
/* envoyer une phrase a mon fils no1 */
sprintf(buf,"Boujour tout le monde de l'Insia !!\n");
write(p1[1],buf, strlen(buf));
/* attend la reponse du fils no 2 */
if ((n=lireLigne(p3[0], buf, LBUF)) > 0) { /* resultat recu */
printf("Resultat : <%s> !\n",buf);
} else { /* rien recu */
printf("Je n'ai rien recu !!\n");
}
}
}
trace("Fin du programme");
return(0);
}
SOn fichier Tool :
/* Ma boite a outils qui complete les librairies standards */
#include <unistd.h>
#include <string.h>
int lireLigne(int fd, char *b, int nc)
/* fd = file descriptor
b = adresse du buffer
nc = nb de caracteres possible (longueur du buffer */
{
char *d, *f;
d = b;
f = b+nc;
while(d<f) {
if (read(fd,d,1) != 1) break;
if (*d == '\n') break;
d++;
}
if (d == f) { /* cas du buffer trop petit */
d=b;
while (*d != '\n') read(fd,d,1);
return(-1);
}
*d = '\0';
return(strlen(b));
}
J-Ph