Процессы Жизненный цикл

advertisement
Процессы
Жизненный цикл
Определение процесса
Совокупность записей в ядре о
выполняющейся задаче, ее адресное
пространство (код, данные, стек)
Процессы должны иметь уникальную
идентификацию
Поддержка процессов ядром
Структура записей в ядре
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
Рекомендованная литература
Download