Процессы Жизненный цикл Определение процесса Совокупность записей в ядре о выполняющейся задаче, ее адресное пространство (код, данные, стек) Процессы должны иметь уникальную идентификацию Поддержка процессов ядром Структура записей в ядре Uid Gid Euid Egid Pgid Sid Root Cwd Sigmask Umask Nice Pid Ppid Lock Сигналы, ожидающие доставки Жизненный цикл процесса Порождение процесса Системный вызов fork() создает новый процесс, выделяя для него место в памяти и помещая в него точную копию адресного пространства родительского процесса Пример порождения main() { pidt pid; int status; pid = fork(); if ( pid==0 ) { printf(“этот код выполняется в \ дочернем процессе); exit ( 0 ); } else printf(“Родитель создал процесс с \ номером %d\n”,pid); wait ( &status ); exit ( 0 ); } Замещение кода Системный вызов exec, #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char arg , ... char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); Конец жизни exit(int) exit (int) pidt wait(int *status) pidt waitpid(pidt pid, int *status,int opt) Наследование Наследуются дескрипторы открытых файлов Маски сигналов Блокировки файлов Реальные uid и gid Отношения с порожденными процессами Оба процесса знают pid друг друга Могут создавать канал Могут посылать сигналы и сообщения друг другу Родитель может завершить дочерний процесс Просмотр списка процессов ps ax ps -ax или Посылка процессу сигнала kill –SIGNUM 12345 kill(SIGKILL,12345); Получение данных о процессе getpid getppid getuid getgid В оболочке ps –ax kill –SIGKILL 1234 top Что читать еще Man(2,3) Еще раз man Робачевкий А. Операционная система UNIX/ любое издание ftp://bkv.vvsu.ru/pub/OSes Рекомендованная литература