Архитектура операционной системы UNIX


         

ОЖИДАНИЕ ЗАВЕРШЕНИЯ ВЫПОЛНЕНИЯ ПРОЦЕССА - часть 4


В такой реализации функций exit и wait имеется одна нерешенная проблема, связанная с тем, что процессы, прекратившие существование, нельзя убирать из системы до тех пор, пока их родитель не исполнит функцию wait. Если процесс создал множество потомков, но так и не исполнил функцию wait, может произойти переполнение таблицы процессов из-за наличия потомков, прекративших существование с помощью функции exit. В качестве примера рассмотрим текст программы планировщика процессов, приведенный на . Процесс производит считывание данных из файла стандартного ввода до тех пор, пока не будет обнаружен конец файла, создавая при каждом исполнении функции read нового потомка. Однако, процесс-родитель не дожидается завершения каждого потомка, поскольку он стремится запускать процессы на выполнение как можно быстрее, тем более, что может пройти довольно много времени, прежде чем процесс-потомок завершит свое выполнение. Если, обратившись к функции signal, процесс распорядился игнорировать сигналы типа "гибель потомка", ядро будет очищать записи, соответствующие прекратившим существование процессам, автоматически. Иначе в конечном итоге из-за таких процессов может произойти переполнение таблицы.

#include <signal.h> main(argc,argv) { char buf[256];

if (argc != 1) signal(SIGCLD,SIG_IGN); /* игнорировать гибель потомков */ while (read(0,buf,256)) if (fork() == 0) { /* здесь процесс-потомок обычно выполняет какие-то операции над буфером (buf) */ exit(0); } }

Рисунок 7.18. Пример указания причины появления сигнала "гибель потомков"

Comments:

Copyright ©




Содержание  Назад  Вперед