Tube bidirectionnels. c++

Signaler
Messages postés
11
Date d'inscription
mardi 22 septembre 2009
Statut
Membre
Dernière intervention
20 novembre 2010
-
Messages postés
11
Date d'inscription
mardi 22 septembre 2009
Statut
Membre
Dernière intervention
20 novembre 2010
-
bonjour,
je voudrais en c++ créer un tube bidirectionnel
qui permetrais comme en bash ma t-on dit de réaliser cette comande :
cat nom_du_fichier.wav /lame --/gzip >up.mp3.gz
à l'aide de execlp et de fork pour la création de père et de fils.
le script changerai un fichier wav en mp3 à l'aide de lame et ensuite le zipperai à l'aide de gzip.
merci

2 réponses

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
cat nom_du_fichier.wav /lame --/gzip >up.mp3.gz

Tu es sur de ta commande ?
Ca ne serait pas:
cat nom_du_fichier.wav | lame -- | gzip > up.mp3.gz


IL faut effectivement que tu forkes et que tu rediriges.
Il y a eu des échanges similaires sur le forum, je t'invite à regarde ce lien (surtout vers la fin):
http://www.cppfrance.com/forum/sujet-GARDER-NOM-FICHIER-ENLEVANT-EXTENSION-ARCHIVE_1380431.aspx

Je pense que ça devrait te débloquer.
Messages postés
11
Date d'inscription
mardi 22 septembre 2009
Statut
Membre
Dernière intervention
20 novembre 2010

merci. je poste le code, il marche.
il suffit de compiler enregistrer,
puis sur la commande g++ main.cpp nom_du_fichier
ensuite mettez un fichier wav là ou est l'exécutable. Et voila il converti le wav en mp3 et le zip.

#include
#include
#include <string.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <fcntl.h>
using namespace std;




int main(int argc, char* argv[])
{
int catlame[2];//descripteur du tube
int lamegzip[2];

int fd_fichier;
string wav,nomfinal,mp3gz=".mp3.gz";
wav=argv[1];
wav.resize(wav.length()-4);
nomfinal=(wav+mp3gz);
fd_fichier=open (nomfinal.c_str(),O_WRONLY| O_TRUNC| O_CREAT,0666);





//création des tubes
if (pipe(catlame)==-1)
{

perror ("erreur a la creation du tube pd");
exit(1);
}
if (pipe(lamegzip)==-1)
{

perror ("erreur a la creation du tube pd2");
exit(1);
}

if (fork()==0)
{//le fils est chargé de l'affichage du fichier
dup2 (catlame[1],1);// redirection de la sortie standard vers l'entré du tube
close (catlame[0]);//on ferme le descripteur servant a la lecture ds le tube car fils ne lit pas ds tube
close (catlame[1]);//ferme le descripteur servant a l'écriture ds le tube devenu inutile ûisque redirigé
close (lamegzip[0]);
close (lamegzip[1]);
execlp("cat","cat",argv[1],NULL);
perror("erreur sur cat");
exit(0);
}

if (fork()==0)
{//fils charger de la convertion du wav en mp3
dup2 (catlame[0],0);// redirection de la sortie standard vers l'entré du deuxième tube
close (catlame[0]);
close (catlame[1]);

dup2 (lamegzip[1],1);
close (lamegzip[0]);
close (lamegzip[1]);

execlp("lame","lame","-","-",NULL);
perror("erreur sur lame");
exit(0);


}

//père s'occupe de la compression du mp3

dup2 (lamegzip[0],0);//on dirige la sortie du tube sur l'entée standard
close (lamegzip[0]);//on ferme le descripteur servant a l'écriture car père n'ecrit pas
close (lamegzip[1]);//on ferme descripteur lecture car devenu inutile car rediriger
close (catlame[0]);
close (catlame[1]);
dup2 (fd_fichier,1);

execlp("gzip","gzip",NULL);
perror("erreur sur gzip");

return 0;
}