Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Уничтожение процессов




Процесс не просто понятие для изучения, а конкретный информационный объект в операционной системе. Над информационными объектами, находящимися в компьютере, естественными оказываются операции, которые осуществляют действия целиком над каждым таким объектом. Для вычислительных процессов оказалось возможным выполнять следующие операции: создание, уничтожение и ожидание завершения. Эти операции далее рассматриваются более детально. Вначале рассмотрим смысловую альтернативу создания процесса – операцию уничтожения имеющегося процесса.

При построении приложений на основе нескольких процессов может возникнуть необходимость принудительно и окончательно прекратить функционирование некоторого другого процесса. Процесс-родитель может уничтожить процесс, который он создал, используя соответствующий системный вызов и идентификатор этого процесса. Отсюда становится понятным простейшее предназначение идентификатора процесса: если родительским процессом создано несколько дочерних процессов, то, используя такой идентификатор, можно задать уничтожение любого из этих дочерних процессов. Для уничтожения процессов-потомков в OS/2 служила системная функция, описываемая прототипом

APIRET DosKillProcess(ULONG action, PID pid).

Ее первый параметр задавал, следует ли уничтожать только одного потомка – дочерний процесс, или же следует уничтожить и всех последующих потомков указанного дочернего. В первом случае использовалось значение 1, во втором 0 или же символические константы DKP_PROCESS и DKP_PROCESSTREE. Второй параметр вызова определял идентификатор дочернего процесса, являющегося объектом уничтожения.

Особенно велика потребность в функции уничтожения процессов внутри Unix, где права пользователя-администратора настолько широки, что ему следует позволить уничтожать любые процессы. В Unix для уничтожения процессов предназначена функция kill(), возможности которой даже несколько шире, чем только уничтожение процесса. Непосредственно для уничтожения процесса ее употребление имеет вид

kill(pid, SIGKILL)

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

Пример использования описанных системных функций в Unix задается программами листингов 7.3.1а, 7.3.1b и 7.3.1c.

 

#include <stdio.h>

#include <sys/types.h>

#include <signal.h>

int main()

{int rc, k;

 

printf("Parent Proccess\n");

rc=fork();

if (!rc) {execl("child1.exe",0); }

printf("For Child Process:\n"); printf("PID=%d \n", rc);

for (k=0; k<10; k++)

{printf("I am Parent (My K=%d)\n", k);

if (k= =6)

{kill(rc, SIGKILL); printf("I am killing my child with PID=%d\n",rc);}

usleep(2000000);

}

printf("Parent ended\n"); exit(0);

}

Листинг 7.3.1a. Программа procest.c для Unix

 

#include <stdio.h>

int main()

{int rc, k;

printf("First Child Proccess\n");

rc=fork();

if (!rc) {execl("child2.exe",0); }

printf("For Second Child Process:\n"); printf("PID=%d \n", rc);

for (k=0; k<30; k++)

{printf("I am First Child (My K=%d)\n", k); usleep(750000); }

printf("First Child ended\n");

exit(0);

}

Листинг 7.3.1b. Программа child1.c для Unix

 

#include <stdio.h>

int main()

{int k;

printf("Demonstration processes, Child 2 Proccess\n");

for (k=0; k<30; k++)

{printf(" ------- I am second Child... (child2=%d)\n", k); sleep(1); }

printf("Child 2 ended\n");

exit(0);

}

Листинг 7.3.1c. Программа child2.c для Unix

Для работающего примера в Unix необходимо создать три исполняемых файла procest.exe, child1.exe и child2.exe, изготовляемых из исходных текстов в листингах 7.3.1а, 7.3.1b, 7.3.1c. Программа procest.c описывает создание еще одного процесса из исполняемого файла child1.exe, который будет дочерним процессом для исходного процесса по программе procest.c, а процесс child2.exe, автоматически запускаемый им на основе программы в листинге 7.3.1c, оказывается процессом-внуком для родительского. Программа в листинге 7.3.1а – после создания процесса и циклической выдачи сообщений на 6-м шаге – приказывает оператором

kill(rc, SIGKILL)

уничтожить дочерний процесс. В результате этого приказа процесс по программе child1.c прекращается, но все еще продолжается процесс по программе child2.c в листинге 7.3.1с, пока он не завершит все действия, предусмотренные в ней. Заметим, что для использования в программе для Unix системных вызовов kill() необходимо включение в исходную программу на языке Си заголовочных файлов types.h и signal.h, первый из которых размещается в подкаталоге sys основного каталога для хранения заголовочных файлов системы программирования на языке Си.

Для уничтожения процессов в операционных системах Windows предназначена функция TerminateProcess(), которая имеет прототип

BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode)

и в котором аргумент hProcess задает какой именно процесс следует уничтожить, а аргумент uExitCode – код завершения для такого принудительного завершения. Нормальный (не принудительный) код завершения задает функция

VOID ExitProcess(UINT uExitCode),

которую следует ставить последней в действиях программы процесса, или вместо нее использовать мобильную (независимую от операционной системы) функцию exit(код), имеющую один аргумент – код завершения.

Программы для Windows, выполняющие те же задачи, что и рассмотренные выше программы из листингов 7.3.1а, 7.3.1b и 7.3.1c для Unix, предлагаются читателю в качестве упр. 1 в конце данной главы.




Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 577; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.