Voilà, je suis en train de bosser avec les pipes, et j'ai constater d'une part que les fonctions read et write ne sont pas blocante contrairement a ce qu'explique mon cours... et d'autre part, je me posait la question de savoir quand le system detruit le pipe. Le detruit t'il quand il n'y a plus aucun descripteur de pipe ouvert?
merc
bon j'ai un probleme, je veux faire l'equivalent de:
sort < fichier | grep chaine | tail > sortie.
j'ai programmé la fonction, mais j'ai un probleme au niveau de la redirection tail > sortie:
[PRE]
void func2(char *pNameFile)
{
int fildes1[2],fildes2[2],dligne1,dligne2;
fildes1[0]=fildes1[1]=fildes2[0]=fildes2[1]=dligne1=dligne2=0;
if (pipe(fildes1) ==-1)
exit(-1);
switch(fork())
{
case -1:
// Erreur
break;
case 0:
// fils1
close(fildes1[ECRITURE]);
if ( pipe(fildes2)==-1 )
break;
switch(fork())
{
case -1:
break;
case 0:
// fils2
close(fildes1[LECTURE]);
close(fildes2[ECRITURE]);
if (dup2(fildes2[LECTURE],STDIN_FILENO) == -1
|| mkfifo("sortie",S_IRWXU|S_IRWXG|S_IRWXO)==-1
|| (dligne2=open("sortie",O_RDWR)==-1)
|| dup2(dligne2,STDOUT_FILENO) ==-1)
break;
close(fildes2[LECTURE]);
close(dligne2);
execlp("tail","tail",NULL);
break;
default:
// fils1
close(fildes2[LECTURE]);
if (dup2(fildes1[LECTURE],STDIN_FILENO) == -1
|| dup2(fildes2[ECRITURE],STDOUT_FILENO) == -1)
break;
close(fildes1[LECTURE]);
close(fildes2[ECRITURE]);
execlp("grep","grep","chaine",NULL);
}
break;
default:
// pere
close(fildes1[LECTURE]);
if (dup2(fildes1[ECRITURE],STDOUT_FILENO) == -1
|| (dligne1=open("fichier",O_RDONLY)==-1)
|| dup2(dligne1,STDIN_FILENO) == -1)
break;
close(fildes1[ECRITURE]);
close(dligne1);
execlp("sort","sort","fichier",NULL);
}
printf("FATAL ERROR\n");
close(fildes1[0]); close(fildes1[1]);
close(fildes2[0]); close(fildes2[2]);
close(dligne1); close(dligne2);
exit(-1);
}
[/PRE]
j'obtient une belle erreur de redirection :/ je ne comprend pas trop pourquoi:/
pt1 j'ai fait de la merde.. je redirigeai sur un pipe... CIMER.
propose mieux, sachant qu'il faut gerer toutes les erreurs...
je vois pas en quoi c'est mieux...
ça factorise le code (-> moins de risques d'erreur) et ça le rend plus lisible, et en plus ça indique clairement la cause de l'erreur ? c'est un des intérêts d'avoir un système d'exceptions, d'ailleurs...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
oui j'ai remarqué ça je voulais faire une saturation de mem en lançant plusieurs fois un processus qui faisait un malloc() sans free et bah nunux il vire les mallocs à la fin du processus #naif_qui_decouvre_en_bidouillant#
JackosKing Le 24/01/2005 à 23:04Edité par JackosKing le 24/01/2005 à 23:09 Attention, rien a voir entre un pipe/semaphore/zone de memoire partagee/file de messages Et malloc new.. Les premiers sont inter processus, donc ils ne sont pas liberes a la fermeture du process, mais quand tous les descripteurs de fichiers/sem etc sont libérés. le malloc etc sont dans la zone de data du process... donc si tu fais un fork, tu as duplication de cette zone, et si tu quittes ton process, tu a une desalloc de la zone datas..
donc c'est très logique en fait.
justement à propos de pipe j'aimerais faire un truc
y'a des progs que je lance par ssh mais évidemment ils sont killés dès que je lance la session.
J'aimerais
-exécuter un processus à partir de init (ça je sais faire)
-mais aussi que son stdout soit redirigé vers un truc qui existe même après avoir fermé la session ssh, que je puisse le retrouver ensuite en faisant un tail -f machin
typiquement j'avais pensé à un pipe mais comment on fait en pratique?
(je pense à seti en mode verbose, pour voir la sortie sans monopoliser un terminal)