1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include<string.h>
main(void)
{
char commande[80];
char *copie,*buffer,*tranche;
int tube[2];
int p=0;
int t=0;
char *file=NULL;
char *argv[10];
char *B=NULL;
char *res=NULL;
char *comup=NULL;
if (pipe(tube) == 1)
syserr("pipe");
printf("entrer des commandes en pipe\n");
gets(commande);
copie= strdup(commande);
tranche = strtok_r(copie,"|",&buffer);
while (tranche != NULL)
{
switch (fork())
{
case 1:
syserr("fork");
case 0:
if (p!=0)
{
if (close(0) == 1)
syserr("close3");
if (dup(tube[0]) != 0)
syserr("dup3");
if (close(tube[0]) == 1
|| close(tube[1]) == 1)
syserr("close4");
while (wait(NULL) != 1);
}
if (strtok_r(NULL,"|",&buffer) != NULL) *********
{
if (close(1) == 1)
syserr("close");
if (dup(tube[1]) != 1)
syserr("dup");
if (close(tube[0]) == 1
|| close(tube[1]) == 1)
syserr("close2");
}
comup = strdup(tranche);
res = strtok_r(comup," ",&B);
file = res;
if (res != NULL) file =res; else res=tranche;
while(res != NULL)
{
argv[t]=res;
t++;
res = strtok_r(NULL," ",&B);
}
argv[t]=NULL;
//printf("path = %s\n",getenv("PATH"));
execvp(file,argv);
exit(0);
break;
}
tranche= strtok_r(NULL,"|",&buffer);
p=1;
}
}
/**/
/* Traitement des erreurs */
/**/
syserr(char *s)
{
printf("erreur de la primitive ");
printf("%s\n",s);
exit(1);
} |
Partager