Операционные системы    
 Учебное пособие
 Долгов В.В.
 Главная|   Содержание|   Скачать архив (50 кб)

 

2. Создание и уничтожение процессов в ОС семейства Unix

 

Специфика создания процессов в системах семейства Unix заключается в том, что любой новый процесс является точной копией создавшего его процесса. Для создания такой копии применяется системный вызов fork(…) возвращающий родительскому процессу номер вновь созданного (дочернего процесса) и нулевое значение дочернему процессу. Например, в следующем примере слово «Привет» будет выведено на консоль системы 32 раза.

int main(int argc, char *argv[])
{
         for(int i=0; i<5; i++) fork();
         printf(“%s\n”, “Привет”);
}

Важно помнить, что анализ результата возвращаемого вызовом fork(…) является единственной возможностью определить в каком (родительском или дочернем) процессе происходит выполнение.

int main(int argc, char *argv[])
{
        if( fork() == 0 ) printf(“%s\n”, “Дочерний”);
        else printf(“%s\n”, “Родительский”);
}

В случае, когда надо запустить другой процесс, код которого расположен в файле, необходимо использовать системные вызовы exec*(…) (где * обозначает различные суффиксы, соответствующие различному набору параметров вызова). Системные вызовы exec*(…) заменяют весь образ памяти текущего процесса содержимым файла, указанным в качестве параметра. Текущий процесс после успешного вызова exec*(…) перестает существовать. Таким образом для запуска нового процесса, отличного от текущего необходимо выполнить две операции: создать копию текущего процесса, заменить одну из копий кодом нового процесса из файла. Например:

int main(int argc, char *argv[])
{
        pid_t pid = fork(); //создаем копию текущего процесса
        //в случае дочернего процесса заменяем код
        if( pid == 0 ) execve(“/usr/ai41/test_process”, NULL, NULL);
        else waitpid(-1, &status, 0); //ожидаем завершения «дочки»
}

Для уничтожения процесса ему необходимо послать один из стандартных (согласно стандарту POSIX) сигналов, означающих завершение процесса. Посылка сигнала выполняется системным вызовом kill(pid, signo), где pid – номер процесса, которому посылается сигнал, а signo – номер сигнала. Стандартом определяются несколько сигналов, отвечающих за завершение работы процесса: SIGTERM – «вежливая» просьба завершить процесс, SIGKILL – безусловное уничтожение процесса, SIGABRT – прервать процесс и записать дамп памяти на диск.




ЗАДАНИЕ 4.

Реализовать задание №2 из прошлого раздела в системе Unix. Возможность выполнения файла определять по атрибуту “x” файла.

ЗАДАНИЕ 5.

Произвести копирование всех файлов из одного каталога в другой (каталоги задаются параметрами командной строки). Копирование каждого файла должно осуществляться отдельным процессом.





 Главная|   Содержание|   Скачать архив (50 кб)