Hilfe bei Programmaufruf mit execl()...
-
Hallo,
ich wollte folgendes tun:
Mein C++ Programm bekommt ständig Daten via RS232 die es abfragt.
Ändert sich der Wert von 0 auf 1 dann soll es den MPlayer aufrufen und eine MP3 Datei abspielen.
Ändert sich der Wert wieder auf 0, soll MPlayer beendet werden.
Ich bekomm es irgendwie nicht hin, dass mein Programm weiterläuft und weiter den RS232 abfragt.
if (Signal == 1) { execl ("/usr/bin/gmplayer", "gmplayer", "/media/SD-CARD/MP3/01.mp3", NULL); }
Aber alles was nach dem execl() Befehl kommt, wird nicht mehr ausgeführt. Zum Beenden möchte der Mplayer gern die Taste q - aber selbst wenn ich die manuell drücke läuft das Programm nicht weiter, sondern ist zuende.
Wie kann ich den Mplayer als extra Prozess aufrufen und steuern, sodass mein eigentliches programm weiterläuft?
Dank und Gruß
Chris
-
das liegt daran, dass die
exec
Funktionen den laufenden Prozess durch die angegebene Binray ersetzen./* PROC A */ ... ... ... execlp(PROCB); /* das wird hier nur ausgeführt, wenn execlp einen Fehler hatte (PROCB nicht gefunden, usw) */
Wenn du aber willst, dass alles weiter läuft, dann musst du einen Prozess mit man: fork(2) erzeugen.
pid_t child; child = fork(); if(child < 0) { perror("fork"); return / exit / was auch immer; } if(child) { /* parent proc. waiting for children termination */ waitpid(child, NULL, 0); } else { /* child proc */ execl ("/usr/bin/gmplayer", "gmplayer", "/media/SD-CARD/MP3/01.mp3", NULL); exit(1); /* execlp had errors */ } ...
-
Wenn man eh nur exec* nimmt, dann doch lieber man: vfork(2) anstelle fork (und eben man: _exit(2) anstelle exit)
-
bei
__exit
kann ich es einsehen, aber wiesovfork
?
-
Weil es extra dafür gemacht wurde :).