Rückgabe von Stdout mit execl()

Post Reply
Message
Author
Tobi F.

Rückgabe von Stdout mit execl()

#1 Post by Tobi F. »

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: Select all

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: Select all

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

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

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: Select all

#!/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.

Post Reply