Перейти к содержанию

Почему зомби???


Рекомендуемые сообщения

Опубликовано: 03 Май 2004 22:10 | IP Logged Ответить, цитируя автора MishaSt

Почему процессы не дохнут??Почему зомби?Где грабли?

Система Linux 2.4.18-3

Причём, если закоментировать wait и вставть printf и придумать счётчик, то окажется, что хандлер вызовется 5 раз, если разкоментировать - 8-мь. Если вставить sleep в вечный цикл - то 16-ть раз.

#include

#include

#include

#include

sig_atomic_t abc;

void handler23(int signo){

int status;

while (wait(&status)==-1){}

abc=status;

}

int main(){

struct sigaction sigact1;

int rval;

int a;

memset(&sigact1,0,sizeof(sigact1));

sigact1.sa_handler=&handler23;

// sigact1.sa_flags=SA_NODEFER; Не помогает

sigaction(SIGCHLD,&sigact1,NULL);

for (a=0;a<50;a++){

rval=fork();

if (rval==0) exit(0);

}

for(;;);

return 0;

}

Вот ps во время работы проги.

9894 pts/10 00:00:03 a

9895 pts/10 00:00:00 a

9896 pts/10 00:00:00 a

9899 pts/10 00:00:00 a

9900 pts/10 00:00:00 a

9901 pts/10 00:00:00 a

9902 pts/10 00:00:00 a

9903 pts/10 00:00:00 a

9904 pts/10 00:00:00 a

9905 pts/10 00:00:00 a

9906 pts/10 00:00:00 a

9907 pts/10 00:00:00 a

9908 pts/10 00:00:00 a

9909 pts/10 00:00:00 a

9910 pts/10 00:00:00 a

9911 pts/10 00:00:00 a

9912 pts/10 00:00:00 a

9913 pts/10 00:00:00 a

9914 pts/10 00:00:00 a

9915 pts/10 00:00:00 a

9916 pts/10 00:00:00 a

9917 pts/10 00:00:00 a

9918 pts/10 00:00:00 a

9920 pts/10 00:00:00 a

9921 pts/10 00:00:00 a

9922 pts/10 00:00:00 a

9923 pts/10 00:00:00 a

9925 pts/10 00:00:00 a

9926 pts/10 00:00:00 a

9927 pts/10 00:00:00 a

9928 pts/10 00:00:00 a

9930 pts/10 00:00:00 a

9931 pts/10 00:00:00 a

9932 pts/10 00:00:00 a

9933 pts/10 00:00:00 a

9936 pts/10 00:00:00 a

9937 pts/10 00:00:00 a

9938 pts/10 00:00:00 a

9939 pts/10 00:00:00 a

9940 pts/10 00:00:00 a

9941 pts/10 00:00:00 a

9942 pts/10 00:00:00 a

9943 pts/10 00:00:00 a

9946 pts/8 00:00:00 ps

Ссылка на комментарий
Поделиться на другие сайты

Хм...Я нашёл решение проблеммы...

Типа я понял, пока хэндлер выполняется, то сигнал в это время системой блочится. Решение я придумал такое. Но я не уверен, что для всех чилдов выполнится сигнал...Хотя по моим прогонам для всех, я даже цикл большой всталял в хандлере. Так что, когда сигнал блочится, то очередь чтоль выстраивается из неполученных сигналов, и большая эта очередь, почему тогда без цикла не выходит, а если нет очереди, то почему мои прогоны давали результат, что всегда все чилды умирали, ведь после цикла и перед выходом может ещё один чилд умереть, а я там цикл большой вставлял? Мне ответили, что просто там флаг для каждого обработчика.

#include #include #include #include void handler23(int signo){int pid;do{    pid=waitpid(-1,NULL,WNOHANG);}while((pid!=-1) && (pid!=0))}int main(){struct sigaction child_sigact;int rval;int i;memset(&child_sigact,0,sizeof(struct sigaction));child_sigact.sa_handler=&handler23;sigaction(SIGCHLD,&child_sigact,NULL);for (i=0;i<50;i++){    rval=fork();    if (rval==0) exit(0); //Child immediately exits}for(;; //Infinity loop.return 0;} 
Ссылка на комментарий
Поделиться на другие сайты

Зобми не существует как процесс, однако для него ещё занят pid и хранится код возврата, всё, что тебе надо сделать - получить их код возврата (man 2 wait). После этого запись о зобми в таблице исчезает.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...