Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
[dashin@dashin zombies]$ ps ax
bash: fork: Resource temporarily unavailable
Разобравшись с тем, что представляют собой зомби, стоит ознакомиться с некоторыми способами устранения создаваемой зомби проблемы.
Один из самых простых способов «убить» зомби – это «убить» их родителя. Если в системе «умирает» какой-либо процесс, то специальный демон init наследует всех потомков умершего процесса и удаляет их, если они уже завершили своё выполнение. Но у нас может не хватать прав на удаление родителя. Возможна ситуация, когда родитель выполняет какие-то необходимые нам действия, и, удалив его, можно потерять данные. Может быть множество причин, препятствующих этому способу. И нам останется только по очереди убивать всех зомби.
Очевидно, что лучше предотвратить зомби, нежели с ними бороться. Одним из решений является использование вышеупомянутой функции wait.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(){
pid_t our_child;
our_child= fork();
if(our_child == 0){
return 0;
}
sleep(10);
wait();
getchar();
return 0;
}
Для наглядности этого примера выполним команду:
top -d 1
и параллельно выполним предварительно откомпилированный пример (см. рис.1).
Рисунок 1. Видимо, не только мы умеем порождать зомби
Как и ожидалось, наш зомби, просуществовав около 10 секунд, будет удалён.
Учитывая то, что если дочерний процесс прерван или остановлен, он шлёт своему родителю сигнал SIGCHLD, тогда можно сделать у родителя обработчик этого сигнала и в нём вызывать wait.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
void killchld(){
wait();
}