Inhaltsverzeichnis
Prozessstatus
Ein Prozess kann sich in den folgenden Zuständen befinden:
Status Bedeutung
- läuft gerade (running) Der Prozess wird gerade ausgeführt.
- lauffähig (runnable) Der Prozess kann ausgeführt werden.
- schlafend (sleeping) Der Prozess wartet darauf, dass er ein Stück Rechenzeit bekommt.
- angehalten (stopped)
- bzw. traced Der Prozess wurde unterbrochen/angehalten.
- Zombie Ein Prozess der beendet, aber noch nicht aus der Tabelle entfernt wurde.
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
