Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab6.doc
Скачиваний:
7
Добавлен:
01.03.2016
Размер:
62.98 Кб
Скачать

6 Лабораторная работа №6

    1. Интерфейс прикладного программирования ос unix: порождение новых процессов и запуск программ

6.1 Цель работы: Изучение программного интерфейса процессов, потоков выполнения (threads), атрибутов процесса, различных способов запуска программ.

6.2 Основные положения

Любая выполняющаяся программа в ОС UNIX является процессом или потоком выполнения. Все процессы, кроме самого первого (init, PID=1) порождаются "отпочковыванием" от родительского процесса в результате вызова им функции fork(). После вызова fork() родительский и порожденный процессы имеют одинаковые сегменты кода и данных, поэтому, чтобы начать выполнение новой программы, порожденный процесс должен выполнить вызов exec().

В рамках одного процесса могут выполняться несколько потоков (thread), в этом случае у них одинаковые атрибуты, за исключением идентификатора (PID) и адреса сегмента стека. Потоки выполнения порождаются специальными системными вызовами, например, pthread_create() или clone() в ОС Linux.

К атрибутам процесса относятся его номер (PID), принадлежность (UID, GID), программная группа (PGID), сеанс (SID), управляющий терминал, приоритет выполнения, текущее состояние, выполняемый файл, адресное пространство, открытые файлы, сигнальная маска, файловые блокировки, переменные среды, маска создания файлов и текущий каталог.

API UNIX предоставляет пользователям несколько функций, позволяющих процессу получить и изменить свои атрибуты.

Номер процесса, его владельца и группу можно получить с помощью вызовов getpid(), getuid() и getgid() соответственно. Суперпользователь может изменить свой идентификатор и группу вызовами setuid() и setgid(gid).

Сеанс и программная группа позволяют системе и пользователю манипулировать сразу несколькими процессами. Сеанс состоит из одной или нескольких программных групп. Когда пользователь входит в систему, порождается новый сеанс. Получить/изменить номер своего сеанса и программной группы процесс может вызовами getsid()/setsid() и getpgid()/setpgid().

Понятие сеанса и программной группы тесно связано с управляющим терминалом. Терминал, с которого пользователь входит в систему, становится управляющим для соответствующего сеанса. Управляющий терминал наследуется всеми потомками лидера сеанса и по умолчанию связан с их потоками ввода/вывода. Процесс может получать сигналы со своего управляющего терминала. Управляющий терминал обычно принадлежит одной из программных групп сеанса. Выяснить принадлежность терминала позволяет системный вызов tcgetpgrp(), сменить владельца терминала - вызов tcsetpgrp(). По своему отношению к управляющему терминалу процессы (точнее, программные группы) делятся на фоновые и интерактивные. Выяснить имя управляющего терминала позволяют функции int isatty (int fildes) и char *ttyname (int fildes).

Маска прав доступа для создания новых файлов может быть получена и установлена вызовом int umask(int mask).

Текущий каталог процесса может быть получен/изменен с помощью вызовов char *getcwd (char *buf, int size)/setcwd(char *buf).

Приоритет выполнения процесса возвращают и изменяют вызовы int getpriority(int which, int who) и int setpriority(int which,int who,int prio).

struct stat {

dev_t st_dev; /* устройство */

ino_t st_ino; /* inode */

mode_t st_mode; /* режим доступа */

nlink_t st_nlink; /* количество жестких ссылок */

uid_t st_uid; /* ID пользователя-владельца */

gid_t st_gid; /* ID группы-владельца */

dev_t st_rdev; /* тип устройства */

/* (если это устройство) */

off_t st_size; /* общий размер в байтах */

unsigned long st_blksize; /* размер блока ввода-вывода */

/* в файловой системе */

unsigned long st_blocks; /* количество выделенных блоков */

time_t st_atime; /* время последнего доступа */

time_t st_mtime; /* время последней модификации */

time_t st_ctime; /* время последнего изменения */

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]