Ich möchte wissen, was tatsächlich passiert, wenn ein Prozess auf Benutzereingaben wartet. Nehmen wir an, in meinem Code habe ich scanf() aufgerufen, um Benutzereingaben von der Konsole zu lesen. Es ruft intern den Systemaufruf read() auf. In diesem Fall sind jedoch keine Daten zu lesen, bis der Benutzer Eingaben macht. Also schläft unser Prozess bis dahin?Was passiert eigentlich mit einem Prozess, der auf Benutzereingaben wartet?
5
A
Antwort
4
Ja, es schläft (in OS X, zumindest).
Versuchen Kompilieren und Ausführen des folgenden C-Programm:
#include <stdio.h>
int main() {
int x;
puts("Enter a number:");
if (scanf("%d",&x)) {
printf("You entered %d\n",x);
}
else {
puts("That isn't a number");
}
return 0;
}
Starten Sie das Programm in der Konsole ausgeführt wird, dann eine andere Konsole öffnen und ps -v
in der Befehlszeile eingeben.
PID STAT TIME SL RE PAGEIN VSZ RSS LIM TSIZ %CPU %MEM COMMAND
19544 S 0:00.01 0 0 0 2463084 1596 - 0 0.0 0.0 -bash
19574 S 0:00.01 0 0 0 2454892 1568 - 0 0.0 0.0 -bash
19582 S+ 0:00.00 0 0 0 2434816 676 - 0 0.0 0.0 ./a
Hier ./a
ist der Name des Programms: Sie sollten etwas sehen. Der Eintrag für diesen Prozess in der Spalte STAT
lautet S+
, was bedeutet, dass der Prozess schläft (S
) und sich im Vordergrund befindet (+
).
Verwandte Themen
- 1. Was passiert eigentlich, wenn ApplicationCommands.Close
- 2. Was passiert eigentlich mit CSS im Hochkontrastmodus?
- 3. Was passiert eigentlich in lwz?
- 4. Wartet auf Prozess
- 5. Wann wartet JavaScript eigentlich?
- 6. Was passiert eigentlich, wenn wir ServiceWorkerRegistration.pushManagersubscribe() aufrufen?
- 7. Was passiert eigentlich, wenn ich in einem OnTouchListener false zurückgebe?
- 8. wartet nicht auf Benutzereingaben im Skript expect
- 9. wartet mein Prozess auf Eingabe?
- 10. Threading-Prozess wartet auf Eingabe
- 11. Was passiert, wenn der Thread vor einem anderen Thread auf ihn wartet (beitreten)?
- 12. Funktionale Programmierung: Wo passiert eigentlich der Nebeneffekt?
- 13. Wie kann ich feststellen, auf was ein Linux-Prozess wartet?
- 14. Was passiert, wenn ein Prozess gespalten wird?
- 15. Was passiert eigentlich, wenn Sie cudaMalloc im Gerät anrufen?
- 16. Was macht StreamingContextStates.Clone eigentlich?
- 17. Programmgesteuert herausfinden, ob ein Prozess Benutzereingaben erfordert
- 18. Was passiert, wenn Interrupt auf Thread, die nicht auf eine Sperre wartet
- 19. Was macht numpy.cov eigentlich?
- 20. Warum wartet fmt.Scanf in Go nicht auf Benutzereingaben?
- 21. Was passiert eigentlich, wenn in einer LINQ-Anweisung async/wait verwendet wird?
- 22. Was passiert, wenn ein Benutzer den Browser beendet und auf einen langen Web-Service-Anruf wartet?
- 23. Was macht addChildViewController eigentlich?
- 24. Was bedeutet eigentlich?
- 25. Was macht eigentlich kCGWindowSharingState * *?
- 26. Was passiert in 'Montage Fegefeuer'?
- 27. Was macht "__COMPAT_LAYER" eigentlich?
- 28. Was bewirkt eigentlich ein Filter?
- 29. Was bedeutet IsPostBack eigentlich?
- 30. Was passiert mit einem Applet, wenn der Browser geschlossen wird?
Ihr Prozess wird * blockiert *, was bedeutet: Warten auf I/O. Der Kernel merkt sich den Status des Prozesses (innerhalb eines Systemaufrufs read()) und lässt ihn laufen, sobald die E/A verfügbar ist. – wildplasser
bedeutet dies, dass der TTY-Treiber den Scheduler irgendwie benachrichtigt, dass Daten verfügbar sind, und der Scheduler den Prozess in die Bereitschaftswarteschlange versetzt? – techiek7
TTY-Treiber ist hier nicht relevant. Das Programm könnte seine Eingabe von einer Pipe oder einem Socket beziehen, oder was auch immer der Dateideskriptor referenziert. IIRC Linux verwendet separate Listen (Warteschlangen) für ausführbare Prozesse und wartende Prozesse. Sobald Daten nicht verfügbar sind, wird der Datensatz des Prozesses zwischen diesen Warteschlangen verschoben. Der Scheduler beschäftigt sich nur mit der * runnable * -Warteschlange. – wildplasser