Операционные системы
Учебное пособие
Долгов В.В. |
2. Создание и уничтожение процессов в ОС семейства Unix
Специфика создания процессов в системах семейства Unix заключается в том, что любой новый процесс является точной копией создавшего его процесса. Для создания такой копии применяется системный вызов fork(…) возвращающий родительскому процессу номер вновь созданного (дочернего процесса) и нулевое значение дочернему процессу. Например, в следующем примере слово «Привет» будет выведено на консоль системы 32 раза. Важно помнить, что анализ результата возвращаемого вызовом fork(…) является единственной возможностью определить в каком (родительском или дочернем) процессе происходит выполнение. В случае, когда надо запустить другой процесс, код которого расположен в файле, необходимо использовать системные вызовы exec*(…) (где * обозначает различные суффиксы, соответствующие различному набору параметров вызова). Системные вызовы exec*(…) заменяют весь образ памяти текущего процесса содержимым файла, указанным в качестве параметра. Текущий процесс после успешного вызова exec*(…) перестает существовать. Таким образом для запуска нового процесса, отличного от текущего необходимо выполнить две операции: создать копию текущего процесса, заменить одну из копий кодом нового процесса из файла. Например: Для уничтожения процесса ему необходимо послать один из стандартных (согласно стандарту POSIX) сигналов, означающих завершение процесса. Посылка сигнала выполняется системным вызовом kill(pid, signo), где pid – номер процесса, которому посылается сигнал, а signo – номер сигнала. Стандартом определяются несколько сигналов, отвечающих за завершение работы процесса: SIGTERM – «вежливая» просьба завершить процесс, SIGKILL – безусловное уничтожение процесса, SIGABRT – прервать процесс и записать дамп памяти на диск. Реализовать задание №2 из прошлого раздела в системе Unix. Возможность выполнения файла определять по атрибуту “x” файла. Произвести копирование всех файлов из одного каталога в другой (каталоги задаются параметрами командной строки). Копирование каждого файла должно осуществляться отдельным процессом. |