Inhaltsverzeichnis

Prozessstatus

Ein Prozess kann sich in den folgenden Zuständen befinden:

Status Bedeutung

Ist ein Prozess lauffähig, heißt dies noch lange nicht, dass er automatisch CPU-Zeit bekommt. Er wird erst dann ausgeführt, wenn ihm CPU-Zeit gewährt wird.

Bekommt ein Prozess Rechenzeit zur Verfügung gestellt, blockiert jedoch ein Systemcall (z. B. Pipe voll durch write()), wird der Prozess erst mal "schlafen gelegt". Genauer gesagt, er wird in der Prioritätsliste etwas herabgelassen und es wird später noch mal geschaut, ob die Pipe immer noch voll ist. Nur das Eintreffen eines Signals kann dieses Warten unterbrechen (sofern der Systemcall dies erlaubt). Im genannten Beispiel würde write() umgehend -1 zurückgeben und errno auf EINTR setzen.

Sie können einen Prozess aber auch anhalten, was dem Schlafen eines Prozesses ähnlich ist. Anhalten könne Sie einen Prozess, indem Sie diesem das Signal STOP schicken. Ein ähnlich lautendes Signal, TSTP, wird den "Vordergrund"prozessen geschickt - was meist die Shell und das aktuelle Kommando sind -, wenn die Tastenkombination zum Anhalten gedrückt wird, i. d. R. STRG+Z. In diesem Falle sendet die Shell dann STOP an den aktuellen Prozess. Mit dem Signal CONT können Sie einen Prozess wieder fortlaufen lassen. Der Unterschied zum angehaltenen Prozess im Gegensatz zum Schlafenden ist der, dass der angehaltene Prozess den Status so lange beibehält, bis ein anderer Prozess diesen Status aufhebt.

stop:  kill -19
start: kill -18

Ein Zombie ist ein Prozess, der sich längst beendet hat bzw. beendet wurde, aber noch nicht aus der Prozesstabelle ausgetragen worden ist (das muss nämlich der Elternprozess machen). Zombie-Prozesse verbrauchen keine Rechenleistung oder sonstigen Speicher, sondern sind nur noch als Prozesseintrag enthalten. Darauf wird noch näher eingegangen. Vereinfacht: Sie brauchen eine PID. Wenn Sie dabei vergessen wait() oder waitpid() (später erklärt) aufzurufen, könnten Sie sich wundern, warum irgendwann (bei einem langlebigeren Programm) keine PIDs mehr frei sind.

# kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX