Ich habe eine C++ - Anwendung mit bestimmten Elementen in einer Warteschlange, diese Elemente werden dann von einem Python-Skript verarbeitet werden. Ich will es so, dass maximal 10 Instanzen des Python-Skripts laufen. Ich plane mit execl() den Python-Prozess zu starten. Gibt es eine Möglichkeit zu sagen, dass der Prozess beendet wurde, ohne eine Nachricht an den übergeordneten Prozess zurückgeben zu müssen?sagen, wenn ein execl() Prozess beendet
Antwort
execl
startet keinen Prozess - es überlagert den vorhandenen Prozess mit einer anderen ausführbaren Datei. fork
startet startet einen Prozess - und gibt die ID des untergeordneten Prozesses (alias pid
) an den übergeordneten Prozess zurück (gibt 0 an den untergeordneten Prozess zurück, so weiß das Kind, dass es das Kind ist, damit es die Dinge aufräumen kann und exec
). Verwenden Sie die pid
der Kinder, um zu überprüfen, ob sie fertig sind oder nicht, oder fangen Sie SIGCHLD ab, um das zu verfolgen.
Ich empfehle die SIGCHLD
, so dass Sie müssen nicht „Umfrage“, um zu sehen, ob irgendein Prozess beendet hat, aber dieser Ansatz ist nicht zu hart, entweder - nur einmal ausgeführt in einer Weile:
def whosdone(pids):
nope = []
done = []
for pid in pids:
try: os.kill(pid, 0)
except OSError: nope.append(pid)
else: done.append(pid)
return done, nope
dh Sie können in regelmäßigen Abständen done, pidslist = whosdone(pidslist)
aufrufen und alles tun, was Sie tun müssen, um die PIDs zu erledigen. Natürlich, wenn Sie fork
, das Idiom verwenden:
pid = os.fork()
if pid: # we're the parent process
pidslist.append(pid)
else: # we're the child process
# clean things up, etc, then exec
Wenn Sie dies in C++ unter Unix/Linux tun Besuche wait(), waitpid(), waitid(), wait3(), or wait4(). Sie können waitpid() NOHANG (polling) aufrufen oder blockieren, bis ein untergeordneter Prozess abgeschlossen ist. Pid (Prozess-ID) wird der Wert zurückgegeben von fork().
I did a painful "hard way" example of fork() earlier (using dup2() to re-route IO).
- 1. SIGCHLD nicht geliefert, wenn ein Prozess beendet
- 2. PYTHON Wie erkenne ich, wenn ein Prozess beendet wurde?
- 3. Wird ein XPC-Unterbrechungshandler aufgerufen, wenn Launchd den Prozess beendet?
- 4. Prozess wird nicht beendet, wenn ich Queue
- 5. Prozess beendet nicht
- 6. Warten auf Java-Prozess beendet
- 7. Wie wurde mein Prozess beendet?
- 8. Multiprocessing Prozess beendet unter Linux
- 9. execl nicht von Kind
- 10. R-Alarm einrichten, wenn langer Prozess beendet ist
- 11. Python-Prozess wird nicht beendet
- 12. execl & printf - um
- 13. WCF TCP-Verbindungen bleiben offen, wenn der Prozess beendet wird
- 14. Spawned Ruby-Prozess auf Windows stirbt, wenn Shell beendet wird
- 15. Wie kann ich feststellen, ob ein Prozess beendet wurde?
- 16. Wie erhalten Sie .gcda-Dateien, wenn der Prozess beendet wird?
- 17. Versuchen, Code auszuführen, wenn Prozess beendet wird C#
- 18. SIGCHLD verstehen, wenn der untergeordnete Prozess beendet wird
- 19. Wie kann man wissen, wann ein Prozess beendet wurde?
- 20. Wie wird ein Remote-Service-Prozess ordnungsgemäß beendet?
- 21. Verwalten Sie eine .NET-App so, dass sie ordnungsgemäß beendet wird, wenn sie beendet/beendet wurde
- 22. Windows-Prozess ausgeführt von Java nicht beendet
- 23. Stopp msbuild Prozess, wenn ein Ziel
- 24. Warten Sie, bis der Prozess beendet ist
- 25. Wiederherstellungsstatus, nachdem der Prozess beendet wurde
- 26. Prozess beenden Problem Thread nicht erfolgreich beendet
- 27. Node.js-Prozess wird bei AWS-Instanzen beendet
- 28. Process.Close() erzeugt Prozess nicht beendet wird, C#
- 29. Wird Prozess/Thread-Release-Mutex beendet?
- 30. Prozess beendet, wenn signalisiert wird, dass ein PThread auf "Join" wartet
Möchten Sie, wie man erweitern können, die Kinder PIDs zu überprüfen, ob sie fertig zu überprüfen? Ich verstehe nicht, wie das würde mir sagen, wenn ihre fertig oder nicht – whatWhat
os.kill (pid, 0) löst eine OSError Ausnahme, wenn Prozess pid beendet wurde (oder ist im Besitz eines anderen Benutzers), keine Ausnahme, wenn pid für die läuft aktueller Benutzer - kein anderer Effekt. Lassen Sie mich dort meine Antwort bearbeiten ... –
Wäre es nicht besser, os.wait (0, os.WNOHANG) zu verwenden? Dadurch wird der untergeordnete Prozess erfasst, ein Ressourcenleck wird entfernt und es wird vermieden, dass jedes Kind durchlaufen wird. – bdonlan