Tube bidirectionnels. c++

tchiibo Messages postés 11 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 20 novembre 2010 - 9 déc. 2009 à 13:06
tchiibo Messages postés 11 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 20 novembre 2010 - 9 déc. 2009 à 15:06
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 déc. 2009 à 14:26
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.
0
tchiibo Messages postés 11 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 20 novembre 2010
9 déc. 2009 à 15:06
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;
}
0
Rejoignez-nous