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

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

Marsh Posté le 27-03-2003 à 11:03:24    

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
Reply

Marsh Posté le 27-03-2003 à 11:03:24   

Reply

Marsh Posté le 27-03-2003 à 11:57:15    

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: ...
 

Reply

Marsh Posté le 27-03-2003 à 18:18:11    

ok merci de ta reponse

Reply

Marsh Posté le 28-03-2003 à 17:01:46    

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

Reply

Marsh Posté le 28-03-2003 à 19:23:19    

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 ?
 

Reply

Marsh Posté le 28-03-2003 à 19:43:24    

le titre du topic me fais PTDR  :lol:


Message édité par skylight le 28-03-2003 à 19:43:31
Reply

Marsh Posté le 31-03-2003 à 23:59:09    

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 .

Reply

Marsh Posté le 01-04-2003 à 05:29:51    

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.

Reply

Marsh Posté le 01-04-2003 à 09:35:51    

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 ...)

Reply

Marsh Posté le 02-04-2003 à 17:19:57    

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 .

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed