Rückgabe von Stdout mit execl()

Antworten
Nachricht
Autor
Tobi F.

Rückgabe von Stdout mit execl()

#1 Beitrag von Tobi F. » 06. Jan 2009 20:23

Abend,
ich schreibe gerade ein kleines Script um den Musiktitel usw von Amarok über ein µC an einem LCD auszugeben.

Die Ausgabe des Musiktitel erreiche ich auf der Konsole mit:
dcop amarok player title
Der Title wird dann auf stdout ausgegeben.

Jetzt habe ich in meinem C Programm eine kleine Funktion um Befehle aufzurufen.

Code: Alles auswählen

int RunCommand(const char *strCommand)
{
	int iForkId, iStatus;
	iForkId = vfork();
	if (iForkId == 0)	// This is the child 
	{
		iStatus = execl("/bin/sh","sh","-c", strCommand, (char*) NULL);
		exit(iStatus);	// We must exit here, 
				// or we will have multiple
				// mainlines running...  
	}
	else if (iForkId > 0)	// Parent, no error
	{
		iStatus = 0;
	}
	else	// Parent, with error (iForkId == -1)
	{
		iStatus = -1;
	}
	return(iStatus);
} 
Beispiel:

Code: Alles auswählen

int iStatus = RunCommand("dcop amarok player title");
Aber wie bekomme ich jetzt den Titel am besten in eine Variable?
Ich habe schon daran gedacht mit > im Befehl die Ausgabe in eine Datei zu schreiben und diese dann wieder einzulesen, aber ich denke das wäre recht unschön.

Hat jemand eine Idee?

Gruß Tobi

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#2 Beitrag von Janka » 06. Jan 2009 22:43

Du musst eine Pipe öffnen und im Kindprozess vor dem exec die Standardausgabe auf diese Pipe verbiegen.

Da viele Leute sowas tun wollen und dabei immer wieder dumme Fehler machen, gibt es popen(). Nimm das statt fork() und exec().

Alternativ solltest du dir das Buch "Advanced Programming in the Unix Environment" von W. Richard Stevens in der Uni-Bibliothek deiner Wahl ausleihen, da stehen solche und andere Interessante Dinge über IPC unter Unix haarklein mit ausführlichen Beispielen drin.

Oder du änderst dein Programm so, dass das Hauptprogramm nicht das C-Programm, sondern tatsächlich ein Shellskript ist. Dann geht das z.B. so

Code: Alles auswählen

#!/bin/sh
while :
do
  dcop amarok player title | displayonlcd
  sleep 10
done
Dein Programm wäre dann "displayonlcd" und würde den anzuzeigenden Text von der Standardeingabe lesen.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Antworten