Изчакване и прекратяване на дъщерен процес
Извикване на exit() изпълнява някои основни стъпки за изключване и след това инструктира ядрото да прекрати процеса.
Параметърът на състоянието (status) се използва за обозначаване на изходното състояние на процеса.
Когато процес завърши, ядрото изпраща сигнал SIGCHLD към родителят.
Преди да прекрати процеса, библиотеката C изпълнява следните стъпки:
Извиква всички функции, регистрирани с atexit() или on_exit(), в обратен ред на тяхната регистрация.
Изчиства всички стандартни отворени вхдни-изходни потоци.
Премахва всички временни файлове, създадени с функцията tmpfile().
Тези стъпки завършват цялата работа, която процесът трябва да направи в потребителското пространство, така че exit() извиква системното повикване _exit(), за да позволи на ядрото да се справи с останалата част от процеса на прекратяване:
Процесът може да бъде прекратен, ако се изпрати сигнал, чието действие по подразбиране е да прекрати процеса. Такива сигнали са SIGTERM и SIGKILL.
Когато процес завърши, ядрото изпраща сигнал SIGCHLD към родителският процес. По подразбиране този сигнал се игнорира и родителят не предприема никакви действия. Процесите могат да изберат да обработват този сигнал, чрез системните извиквания signal() или sigaction().
wait() връща стойността на идентификатора (pid) на дъшерен процес или -1 при грешка.
Ако никакъв дъщерен процес не е прекратен, извикването блокира, докато дъщерен процес приключи.
WIFEXITED връща вярно (true), ако процесът завърши нормално.
При нормално прекратяване WEXITSTATUS осигурява осем бита, които се предават на _exit.
WIFSIGNALED връща вярно (true), ако сигнал е причинил прекратяването на процеса.
В случай на прекратяване от сигнал WTERMSIG връща номера на този сигнал.
В случай на прекратяване от сигнал, WCOREDUMP връща вярно (true), ако процесът натоварва ядро в отговор на получаването на сигнала.
WIFSTOPPED и WIFCONTINUED връщат вярно (true), ако процесът е бил спрян или продължен.
Ако WIFSTOPPED е вярно (true), WSTOPSIG предоставя номера на сигнала, който е спрял процеса.
При възникване на грешка има две възможни стойности:
Грешка | Информация |
---|---|
ECHILD | Извикващият процес няма дъщерни процеси. |
EINTR | Извикването проключи по-рано поради получен сигнал. |
Last updated