fork & exec: Zeitmessung nebenläufiger Kommandos

Tommy57

Erfahrenes Mitglied
Hi,

ich sitze aktuell an einer Hausaufgabe und habe da mal eine theoretische Frage. Ich möchte Befehle über die Tastatur ausführen. Mehrere Befehle können mit Semikolon getrennt werden und sollen dann parallel ausgeführt werden.

Nachdem ich alle gestartet habe, möchte ich nun mit die Laufzeit jedes Befehls messen. Da die Befehle aber nebenläufig sind, habe ich Schwierigkeiten alle gleichzeitig zu messen.

Meine Überlegung ist, in einer while Schleife, nachdem bereits alle Befehle gestartet sind, mit Waitpid WNOHANG abwechselnd ständig alle Prozesse abzufragen und sobald einer Terminiert ist, die Zeit zu vermerken. Sobald alle durch sind, aus der Schleife rausspringen.

Ist der Ansatz okay?

Gruß, Tommy
 

Technipion

Erfahrenes Mitglied
Hmm. Die Frage ist jetzt ja leider nicht super konkret.

Meine Überlegung ist, in einer while Schleife, nachdem bereits alle Befehle gestartet sind, mit Waitpid WNOHANG abwechselnd ständig alle Prozesse abzufragen und sobald einer Terminiert ist, die Zeit zu vermerken. Sobald alle durch sind, aus der Schleife rausspringen.
Oh Jesses. Ich glaube das wird erstklassiger Spaghetticode, den du dir da basteln willst. Spricht denn irgendwas dagegen, dass die Threads selbst ihre Ausführungszeit stoppen?

Gruß Technipion
 

Tommy57

Erfahrenes Mitglied
@Technipion Wie kann ich denn im Kind die Zeit messen? Ich soll die Funktion times() verwenden.

@ComFreek Was genau kann ich dann damit anstellen, um die Zeit zu messen? Also ich benutze ja waitpid und überprüfe den Status == 0. Das sollte doch ausreichen? Was kann ich denn mit SIGCHLD an dieser Stelle mehr machen?
 

Technipion

Erfahrenes Mitglied
Tommy57 kannst du mal deinen bisherigen Code posten?

Weil ich habe im Moment den Eindruck du versuchst dir eine Art Windows-spezifische Prozesssteuerung zu basteln. Und da leuten bei mir gleich sämtliche Alarmglocken.

Gruß Technipion
 

ComFreek

Mod | @comfreek
Moderator
@Technipion Wie kann ich denn im Kind die Zeit messen? Ich soll die Funktion times() verwenden.
Wenn du wirklich fork + exec nutzt, geht das nicht, denn du gibst die Steuerung über dein geforktes Kind mit der Benutzung von exec quasi komplett ab.

@ComFreek Was genau kann ich dann damit anstellen, um die Zeit zu messen? Also ich benutze ja waitpid und überprüfe den Status == 0. Das sollte doch ausreichen? Was kann ich denn mit SIGCHLD an dieser Stelle mehr machen?
Das Problem an deinem Ansatz (generell Polling genannt) ist, dass du damit CPU-Zeit vergeudest. Wenn waitpid tatsächlich jedes Mal einen Syscall absetzt, dann umso mehr, weil es einen Kontextwechsel ins Betriebsystem erfordert.
Beim Ansatz mit SIGCHLD (Aktion erst bei Benachrichtung ausführen, generell Interrupt genannt) ist das gar nicht der Fall.
Es gibt Szenarien, wo Polling besser als Interrupts sind, aber ich denke, hier ist es nicht der Fall.