Міністерство освіти України
НУ “Львівська політехніка”
Кафедра ЕОМ
Звіт
про виконання лабораторної роботи №3
з дисципліни
“Проектування операційних систем, утиліт і драйверів”
Назва роботи:
“Системнi виклики opendir, readdir, closedir, rewinddir, seekdir, telldir та scandir”
Мета: Ознайомитися і навчитися використовувати функції для роботи з директоріями opendir, readdir, closedir, rewinddir, seekdir, telldir, scandir операційної системи Linux. Ознайомитись (чи згадати і закріпити) з механізмом передачі параметрів у програму.
Вихідний текст програми
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#define NAME_LENGTH 256
#define USING "using: \"labor3 <dir_name>\"\n"
#define ERROR "error while reading directory\n"
void processDir(DIR *);
int main(int argc, char **argv) {
DIR * dir;
if (argc != 2) {
fprintf(stderr, USING);
exit(-1);
} else if ((dir = opendir(argv[1])) == 0) {
fprintf(stderr, ERROR);
exit(-1);
}
processDir(dir);
closedir(dir);
exit(0);
}
void processDir(DIR * dir) {
struct dirent * dirEntry;
int i = 0;
while((dirEntry = readdir(dir)) != NULL) {
printf("%4d\t%s\n", i++, dirEntry->d_name);
}
}
На вхід програми подається ім’я директорії (якщо воно містить пробіли, то береться в подвійні лапки). Вихід – на консоль виводиться список елементів заданої директорії.
Призначення, синопсис та основні параметри системних викликів
DIR *opendir(const char *name) – відкрити директорію для читання;
int closedir(DIR *dir) – закрити директорію;
readdir – читання елемента директорії
_syscall3(int, readdir, uint, fd, struct dirent *, dirp, uint, count);
int readdir(unsigned int fd, struct dirent *dirp, unsigned int count);
struct dirent {
long d_ino; /* inode number */
off_t d_off; /* offset to this dirent */
unsigned short d_reclen; /* length of this d_name */
char d_name [NAME_MAX+1]; /* file name (null-terminated) */
}
struct dirent *readdir(DIR *dir);
void rewinddir(DIR *dir) – скид потоку директорії (встановлення вказівника на перший
void seekdir(DIR *dir, off_t offset) – встановити позицію для наступного виклику readdir() в потоці директорії.
void telldir(DIR *dir) – повернення поточного розташування в потоці директорії.
int scandir(const char *dir, struct dirent ***namelist,
int (*select)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **)) – сканування директорії на виявлення вмісту;
int alphasort(const struct dirent **a, const struct dirent **b) – функція для порівняння двох елементів директорії.
Висновок
В процесі виконання даної лабораторної роботи я ознайомився із системними викликами ОС Linux, які використовуються для роботи із директоріями файлової системи.
Список літератури
Кейт Хевіленд, Дайна Грей, Бен Салама “Системное программирование в Unix”. Москва 2000.
Електронні ресурси кафедри ЕОМ.