Kończenie procesu
Transkrypt
Kończenie procesu
Kończenie procesu ✦ Proces kończy się (ang. terminate) wówczas, gdy wykona swoją ostatnią instrukcję i za pomocą funkcji systemowej exit poprosi system operacyjny aby go usunął a także aby ✦ przekazał dane wyjściowe z potomka do procesu macierzystego (za pośrednictwem funkcji systemowej wait wydanej w procesie macierzystym) ✦ wszystkie zaalokowane zasoby (pamięć fizyczna i wirtualna, otwarte pliki, bufory we/wy) odebrał potomkowi Kończenie procesu (c.d.) ✦ Proces macierzysty może zakończyć potomka ( np. funkcją systemową abort ) bowiem ✦ potomek nadużył zasobów ✦ wykonywanie potomka stało się jałowe ✦ proces macierzysty kończy się ✦ system operacyjny nie pozwala potomkowi na działanie jeśli proces macierzysty kończy działanie ✦ system operacyjny wymusza zakończenie wszystkich potomków kończenie kaskadowe (ang. cascading termination) ✦ Wysyłanie (asynchroniczne) sygnału do procesu ✦ kill [-sygnał] pid ✦ Ctrl+Z – zawieszenie procesu : sygnał TSTP ✦ Ctrl+C – zakończenie procesu: sygnał INT ✦ Ctrl+\ – usunięcie procesu: sygnał QUIT Sygnały - Linux SIGHUP – odłączenie terminala SIGINT – przerwanie SIGQUIT – odłączenie klawiatury SIGILL – bląd rozkazu SIGTRAP – pułapka śledzenia SIGABRT – abort (SIGIOT) SIGBUS – błąd szyny SIGFPE – błąd zmiennoprzecinkowy SIGKILL – zakończenie procesu (nieblokowane) SIGUSR1 – sygnał użytkownika SIGSEGV – naruszenie segmentacji SIGUSR2 – sygnał użytkownika SIGPIPE – awaria potoku SIGALRM – sygnał zegara (budzik) SIGTERM – programowe zakończenie procesu SIGSTKFLT – błąd stosu SIGCHILD – zmiana stanu procesu potomnego SIGCONT – wznowienie wstrzymanego procesu SIGSTOP – STOP (nieblokowane) SIGTSTP – wprowadzenie STOP z klawiatury SIGTTIN – czytanie w tle na tty SIGTTOU – pisanie w tle na tty SIGURG – sygnał z gniazda SIGXCPU – przekroczenie czasu procesora SIGXFSZ – przekroczenie rozmiaru pliku SIGVTALARM – budzik zegara wirtualnego SIGPROF – profilowanie budzika zegara SIGWINCH – zmiana rozmiaru okna SIGIO – sygnał gotowości we/wy (SIGPOLL) SIGPWR – niedobór mocy SIGSYS – błąd wywołania systemowego SIGRTMAX – pierwszy sygnał czasu rzeczywistego SIGRTMIN – ostatni sygnał czasu rzeczywistego POSIX, ANSI, BSD, SYSV Kill #include #include #include #include #include #include <sys/types.h> <wait.h> <unistd.h> <signal.h> <stdio.h> <stdlib.h> int main(void) { pid_t child; int errret; if((child = fork()) < 0) { perror("fork"); exit(EXIT_FAILURE); } else if(child == 0) { /* in the child process */ sleep(30); } else { /* in the parent */ errret = kill(child, SIGCHLD); if(errret < 0) perror("kill:SIGCHLD"); else sleep(20); if((kill(child, SIGTERM)) < 0) perror("kill:SIGTERM"); waitpid(child, NULL, 0 ); } exit(EXIT_SUCCESS); }