ВУЗ:
Составители:
5. Системные вызовы для работы с каталогами (директориями).
18
ЛАБОРАТОРНАЯ РАБОТА №3
Управление процессами
1. Идентификатор процесса
Данные ядра, находящиеся в контексте ядра процесса, не могут
быть прочитаны процессом непосредственно. Для получения информации
о них процесс должен совершить соответствующий системный вызов.
Значение идентификатора текущего процесса может быть получено с по-
мощью системного вызова getpid(), а значение идентификатора родитель-
ского процесса для текущего процесса с помощью системного вызова
getppid(). Прототипы этих системных вызовов и соответствующие типы
данных описаны в системных файлах <sys/types.h> и <unistd.h>. Систем-
ные вызовы не имеют параметров и возвращают идентификатор текуще-
го процесса и идентификатор родительского процесса, соответственно.
Прототипы системных вызовов
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void) ;
pid_t getppid(void);
Тип данных pid_t является синонимом для одного из целочисленных
типов языка Си.
Задание: В качестве примера использования системных вызо-
вов getpid() и getppid() самостоятельно напишите программу, печатаю-
щую значения PID и PPID для текущего процесса. Запустите ее несколько
раз подряд. Посмотрите, как меняется идентификатор текущего процесса.
Объясните наблюдаемые изменения.
2. Создание нового процесса
В операционной системе UNIX новый процесс может быть порожден
единственным способом с помощью системного вызова fork(). Процесс,
который инициировал системный вызов fork, принято называть родитель-
ским процессом (parent process). Вновь порожденный процесс принято на
23
#include <dirent.h>
DIR *opendir (char *dirname);
struct dirent *readdir(DIR *dirp);
struct dirent *rewindir(DIR *dirp);
int closedir(DIR *dirp);
Функция opendir служит для открытия потока информации для ка-
талога. Тип данных DIR представляет собой некоторую структуру дан-
ных, описывающую такой поток. Функция opendir позиционирует поток
на первой записи каталога. С точки зрения программиста в этом интер-
фейсе каталог представляется как файл последовательного доступа, над
которым можно совершать операции чтения очередной записи и пози-
ционирования на начале файла. Чтение очередной записи из каталога
осуществляет функция readdir(), одновременно позиционируя указатель
на начале следующей записи (если она, конечно, существует). Для опера-
ции нового позиционирования на начале каталога (при необходимости)
применяется функция rewinddir(). После окончания работы с каталогом
его необходимо закрыть с помощью функции closedir(). Тип данных struct
dirent представляет собой некоторую структуру данных, описывающую
одну запись в каталоге. Поля этой записи сильно варьируются от одной
файловой системы к другой, но одно из полей всегда присутствует в ней.
Это поле char d_name[] неопределенной длины, не превышающей значе-
ния NAME_MAX+1, которое содержит символьное имя файла, завершаю-
щееся символом конца строки. Данные, возвращаемые функцией readdir,
переписываются при очередном вызове этой функции для того же самого
потока каталога.
Задание: используя системные вызовы для работы с файлами и кa
талогами, реализуйте программу на языке Си, позволяющую сделать рас-
печатку содержимого каталога, указав тип файла и права доступа (аналог
команды ls с ключом l). Задача повышенной сложности рекурсивная
распечатка содержимого вложенных каталогов.