2016-10-05 3 views
5

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

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

+0

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

+2

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

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