Code: Alles auswählen
try
phnd := TProcess.Create(nil);
phnd.CommandLine := sndplayer + sound;
phnd.Options := [];
phnd.Execute;
finally
phnd.Free;
end;
Ich starte unter Linux (Raspbian) den omxplayer und übergebe ein Soundfile, welches abgespielt wird. Das Programm darf nicht auf das Ende des Abspielens warten und eigentlich interessiert das Programm sich nicht für den Erfolg des Abspielens.
Nun erzeugt mir das leider jedesmal einen Zombieprozess (<defunct>), und die sammeln sich an. Da mein Programm dauerhaft läuft, werden dessen Childs, sprich die Zombies auch nicht gelöscht.
Nun habe ich zu den Zombies die Info gefunden "Der Linux-Kernel bietet für Prozesse, die nicht am Status ihrer Kinder interessiert sind, eine einfache – wohlgemerkt nicht standardisierte – Methode, Zombies loszuwerden: Gibt ein Prozess explizit an, dass er SIGCHLD ignorieren will (im Gegensatz zum Ignorieren per Default, wenn kein Handler angegeben ist), so löscht Linux die Zombies automatisch, ohne auf eine Statusabfrage zu warten." https://de.wikipedia.org/wiki/Zombie-Prozess#Besonderheit_im_Linux-Kernel
Sowas hätte ich gern, allerdings finde ich unter https://www.freepascal.org/docs-html/fcl/process/tprocess.options.html nichts dazu.