controlar programa con tuberias

rodrigo ahumada rodahummont en yahoo.com.ar
Vie Feb 4 21:31:24 CLST 2005


hola:
  tengo una duda de tuberias:

  resulta que me encontre un programa en python que controla mplayer en modo "slave", osea que recive comandos 
  como pause, seek, quit desde stdin.

  la linea que lanza mplayer:
    	self.mplayerIn,self.mplayerOut=os.popen2("mplayer -slave -quiet \"" + target + "\" 2>/dev/null")  #open pipe
	fcntl.fcntl(self.mplayerOut, fcntl.F_SETFL, os.O_NONBLOCK)

  para despues mandar comandos con:
  	self.mplayerIn.write(command + "\n")
	self.mplayerIn.flush()  #flush pipe

  se me ocurrio probar lo mismo pero en c, lanza mplayer, toca la cancion, despues de un tiempo le mando mas 
  comandos pero mplayer los ignora... probe usando FILE* y file-descriptores y los resultados son los mismos.
[-----------]
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

char *seek_txt="seek -1\n";
char *pausa_txt="pause\n";
char *quit_txt="quit\n";

main() {
	FILE *pipe=popen("mplayer -slave -quiet \"/home/rod/musica/mi-cancion.mp3\" 2>/dev/null","w");
	if (pipe==NULL) {
		printf("no se pudo\n");
		return;
	}
	fcntl(fileno(pipe),F_SETFL,O_NONBLOCK);
	
	printf("seek...\n");
	//fprintf(pipe,"seek -1");
	fwrite(seek_txt,sizeof(char),strlen(seek_txt),pipe);
	fflush(pipe);
	
	printf("sleep...\n");
	sleep(6);
	
	printf("pausa...\n");
	//fprintf(pipe,"pause");
	fwrite(pausa_txt,sizeof(char),strlen(pausa_txt),pipe);
	fflush(pipe);
	
	printf("quit...\n");
	//fprintf(pipe,"quit");
	fwrite(quit_txt,sizeof(char),strlen(quit_txt),pipe);
	fflush(pipe);
	
	fclose(pipe);
	printf("listo\n");
}
[-----]

    me falta algo? alguien sabe que cosas hace popen2 de python aparte de hacer popen?
    gracias.



Más información sobre la lista de distribución Linux