Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
900 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Resolu[c/Linux]Comment recupérer les infos d'un pipe sans perte de don

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Resolu[c/Linux]Comment recupérer les infos d'un pipe sans perte de don

n°344955
psebcopath​e
Posté le 27-03-2003 à 11:03:24  profilanswer
 

Je m'explique mieux , MOn application lance un programme (mplayer pour lire les fichiers audios) avec  fork   et communique avec ceui ci par des pipes , le pb , c'est quand je récupère les données de e programmes, des fois , il en  zappe  certaines .
Hors je veux abolument les récupérér car ca me permet de détecter au niveua de mon appli quand il ya eu un changement de chanson .
voila le code , svp aidez moi .
 

Code :
  1. #include "mplayer_backend.h"
  2. #include "select_unselect_utility.h"
  3. //variables globales ,oulala tout ca :-) !
  4. static int pipe_in[2], pipe_out[2];
  5. pid_t  mplayer_pid;          //processus enfant
  6. static pthread_mutex_t mplayer_mutex;
  7. int firsttime=1;
  8. char *song_ref="none";
  9. void write_mplayer_cmd (char *buff)
  10. {       
  11.     write(pipe_in[1],buff,strlen(buff));
  12.     write(pipe_in[1],"\n",1); 
  13. }
  14. int mplayer_get_media_change(void)
  15. {
  16.   char buff[1024];       
  17.   char *data="none";
  18.   while(1){
  19.    fcntl(pipe_out[0],F_SETFL,O_NONBLOCK);
  20.    pthread_mutex_lock (&mplayer_mutex);
  21.    read(pipe_out[0],buff,sizeof(buff));
  22.  
  23.    if (sscanf(buff,"%a[^\f\r]\n",&data)==1){
  24.      // fprintf(stdout,"data: %s\n",data);
  25.       if(strstr(data,"Starting playback" )!=NULL){
  26. //je recupere cette ligne pour savoir qu'une chanson est jouée
  27.           if(!firsttime) {
  28.               next_playlist_element();
  29.            }
  30.            firsttime=0;
  31.    
  32.       }
  33.    }
  34.    pthread_mutex_unlock (&mplayer_mutex);
  35.    *buff='\n';
  36.   usleep(100000);
  37.   }
  38.    return 0;         
  39. }
  40. void mplayer_stop ()
  41. {
  42.   pthread_mutex_lock (&mplayer_mutex);
  43.   write_mplayer_cmd ("seek 0  1\npause" );
  44.   pthread_mutex_unlock (&mplayer_mutex);         
  45. }
  46. void mplayer_pause ()
  47. {
  48.   pthread_mutex_lock (&mplayer_mutex);
  49.   write_mplayer_cmd ("p" );
  50.   pthread_mutex_unlock (&mplayer_mutex);
  51. }
  52. void mplayer_foreward ()
  53. {
  54.   pthread_mutex_lock (&mplayer_mutex);
  55.   write_mplayer_cmd ("seek 10" );
  56.   pthread_mutex_unlock (&mplayer_mutex);
  57. }
  58. void mplayer_backward()
  59. {
  60.   pthread_mutex_lock (&mplayer_mutex);
  61.   write_mplayer_cmd ("seek  -10" );
  62.   pthread_mutex_unlock (&mplayer_mutex);
  63. }
  64. void mplayer_pl_next ()
  65. {
  66.   pthread_mutex_lock (&mplayer_mutex);
  67.   write_mplayer_cmd ("pt_step 1" );
  68.   pthread_mutex_unlock (&mplayer_mutex);
  69. }
  70. void mplayer_pl_previous ()
  71. {
  72.   pthread_mutex_lock (&mplayer_mutex);
  73.   write_mplayer_cmd ("pt_step  -1" );
  74.   pthread_mutex_unlock (&mplayer_mutex);
  75. }
  76. void mplayer_play (char* pathname)
  77. {
  78.   char cmd[64+PATH_MAXI*2];
  79.   char *MPlayerCmd = " mplayer -ao oss -slave -playlist" ;
  80.   if (pipe (pipe_in) < 0) {
  81.     fprintf (stdout,"pipe_in: %s", cmd);
  82.     exit (1);
  83.   } 
  84.   if (pipe (pipe_out) < 0) {
  85.     fprintf (stdout,"pipe_out: %s",cmd);
  86.     exit (1);
  87.   } 
  88.   if ((mplayer_pid = fork ())==0)   //créer un nouveau processus enfant               , test = 0 pour savoir si enfant démarré
  89.   {
  90.       close(pipe_in[1]);
  91.       close(pipe_out[0]);
  92.       dup2(pipe_in[0],STDIN_FILENO);
  93.       dup2(pipe_out[1],STDOUT_FILENO);
  94.       dup2(pipe_out[1],STDERR_FILENO);
  95.       close(pipe_in[0]);
  96.       close(pipe_out[1]);
  97.       fcntl(pipe_out[0],F_SETFL,O_NONBLOCK);
  98.      
  99.       snprintf(cmd,sizeof(cmd),"%s \"%s\" ",MPlayerCmd,pathname);
  100.       launch_player(cmd);                -
  101.       pthread_mutex_init (&mplayer_mutex, NULL);
  102.       pthread_mutex_init (&track_mutex, NULL);
  103.    }
  104. }
  105. void mplayer_quit ()
  106. {                   
  107.   pthread_mutex_lock (&mplayer_mutex);
  108.   write_mplayer_cmd ("q" );
  109.   pthread_mutex_unlock (&mplayer_mutex);   
  110. }


Message édité par psebcopathe le 02-04-2003 à 17:20:27
mood
Publicité
Posté le 27-03-2003 à 11:03:24  profilanswer
 

n°345108
western
AJMM
Posté le 27-03-2003 à 11:57:15  profilanswer
 

psebcopathe a écrit :


Comment recupérer les infos d'un pipe sans perte de données
(...)


On ne peut perdre des données dans un pipe (tout ce qui entre, doit sortir).  
Si le pipe est plein, le processus écrivin est bloqué sur write. Si le pipe est vide, le processus lecteur est bloqué sur read ... SAUF si on utilise NONBLOCK, dans quel cas, les données du pipe sont écrasées par les nouvelles!
 
Conclusion: ...
 

n°345809
psebcopath​e
Posté le 27-03-2003 à 18:18:11  profilanswer
 

ok merci de ta reponse

n°346730
western
AJMM
Posté le 28-03-2003 à 17:01:46  profilanswer
 

psebcopathe a écrit :

ok merci de ta reponse


mea culpa: en cas d'un NOBLOCK et si le pipe est vide, la lecture (read) sort avec un "erreur" (non mortel). etc.
Donc, je pense que tes pertes viennent du fait que write ne peut écrire dans un tube plein, donc ces données passent à la trappe.
 
Notez: tout vient de NOBLOCK

n°346833
psebcopath​e
Posté le 28-03-2003 à 19:23:19  profilanswer
 

le pb c'est que si je mets pas NOBLOCK , j'ai plus le son de mes chansons et le clavier freeze , elle est ou la connerie ?
 

n°346845
skylight
Made in France.
Posté le 28-03-2003 à 19:43:24  profilanswer
 

le titre du topic me fais PTDR  :lol:


Message édité par skylight le 28-03-2003 à 19:43:31
n°348682
psebcopath​e
Posté le 31-03-2003 à 23:59:09  profilanswer
 

up de minuit .
J'ai cherche et je n'ai tjs pas trouve , si qqu a une piste pour eviter le NO_BlOck et que ca puisse marcher , je suis preneur .

n°348730
Threep
I'm a mighty pirate!
Posté le 01-04-2003 à 05:29:51  profilanswer
 

La primitive write retourne le nombre d'octects effectivement écrits, donc déjà ça te permet de vérifier où cloche ton prog (Est ce que tout est bien écrit dans le pipe), et dans ce cas, de pouvoir le corriger. Si tu sais combien d'octets tu as écrit, tu sais aussi combien tu n'en as pas écrit, donc lesquels tu dois renvoyer, le temps que le lecteur ait lu (et donc vidé) dans le pipe.

n°348778
western
AJMM
Posté le 01-04-2003 à 09:35:51  profilanswer
 

psebcopathe a écrit :

up de minuit .
J'ai cherche et je n'ai tjs pas trouve , si qqu a une piste pour eviter le NO_BlOck et que ca puisse marcher , je suis preneur .


Peut-être essayer d'ordonner mieux les process ...
Sinon, tu posissionne NOBLOCK et tu surveille les messages d'erreur de write (errno doit être égale à quelque chose ...)

n°350379
psebcopath​e
Posté le 02-04-2003 à 17:19:57  profilanswer
 

OK , merci , c'est bon ca marche maintenant !
le seul changement effectué , a été de virer les NOBLOCK et dans la fonction "play" , de rajouter a la fin : "close (2);" et now ca rox sans pb .


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Resolu[c/Linux]Comment recupérer les infos d'un pipe sans perte de don

 

Sujets relatifs
Programmation GTK Linux , problème de #includerécupérer les évènements clavier
Comment recuperer l'objet d'une ListBoxrecuperer un cookie
pilote periph linuxRécupérer le nom de champs d'une base de données Access
[resolu]selectionner automatiquement toutes les option d'1 selectprobleme programmation driver linux de carte E/S
Linux, ports série et pb de synchronisation (pour experts)[Résolu] Un GetWindowText qui plante...
Plus de sujets relatifs à : Resolu[c/Linux]Comment recupérer les infos d'un pipe sans perte de don


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR