Гость Опубликовано 3 мая, 2004 Жалоба Поделиться Опубликовано 3 мая, 2004 Опубликовано: 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 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 4 мая, 2004 Жалоба Поделиться Опубликовано 4 мая, 2004 Хм...Я нашёл решение проблеммы... Типа я понял, пока хэндлер выполняется, то сигнал в это время системой блочится. Решение я придумал такое. Но я не уверен, что для всех чилдов выполнится сигнал...Хотя по моим прогонам для всех, я даже цикл большой всталял в хандлере. Так что, когда сигнал блочится, то очередь чтоль выстраивается из неполученных сигналов, и большая эта очередь, почему тогда без цикла не выходит, а если нет очереди, то почему мои прогоны давали результат, что всегда все чилды умирали, ведь после цикла и перед выходом может ещё один чилд умереть, а я там цикл большой вставлял? Мне ответили, что просто там флаг для каждого обработчика. #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;} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 4 мая, 2004 Жалоба Поделиться Опубликовано 4 мая, 2004 Зобми не существует как процесс, однако для него ещё занят pid и хранится код возврата, всё, что тебе надо сделать - получить их код возврата (man 2 wait). После этого запись о зобми в таблице исчезает. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 4 мая, 2004 Жалоба Поделиться Опубликовано 4 мая, 2004 Сорри, стормозил, невнимательно прочитал прогу. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.