Лабораторная работа "Системные вызовы для работы с файлами" - efanov/mephi GitHub Wiki
Изучаемые системные вызовы: open
, close
, read
, write
, getdents
.
При выполнении работы активно используйте man(2)
для выяснения значения параметров системных вызовов, особенностей их работы и правильной обработки ошибок.
Напишите указанные программы, чтобы они повторяли функциональность одноимённых стандартных программ. В задачах необходимо использовать изучаемые системные вызовы везде, где это возможно.
Программа должна выводить сконкатенированное символом переноса строки (\n
) содержимое файлов, имена которых переданы ей на вход в качестве аргументов командной строки.
- Количество аргументов произвольно.
- Некоторые файлы могут не существовать: порядок действий в этом случае определите сами.
- Файлы текстовые, могут быть пустыми.
Пример ожидаемой работы программы:
echo "file1 content." > file1
echo "file2 content." > file2
./cat file1 file2
# Вывод:
# file1 content.
# file2 content.
Программа должна копировать содержимое одного файла в другой файл.
- Имена файлов передаются в качестве аргументов командной строки.
- Если файла назначения не существует, его необходимо создать.
- Копируемого файла может не существовать.
- Копируемый файл текстовый, может быть пустым.
Пример ожидаемой работы программы:
echo "file1 content." > file1
./cp file1 file2
cat file2
# Вывод:
# file1 content.
Программа должна выводить содержимое директории.
- Директория может быть передана аргументом командной строки.
- Если директория не указана, выводится содержимое текущей директории.
- Содержимое директории — список файлов в ней, разделённый символом переноса строки.
Пример ожидаемой работы программы:
touch file1
touch file2
./ls
# Вывод:
# file1
# file2
Подсказка
Внимательно ознакомьтесь с man(2)
для системного вызова getdents
.
Для осуществления системного вызова getdents
необходимо вызвать функцию
long syscall(SYS_getdents, unsigned int fd, struct linux_dirent *dirp, unsigned int count);
Также Вам потребуется объявить структуру
struct linux_dirent {
unsigned long d_ino;
off_t d_off;
unsigned short d_reclen;
char d_name[];
};
В начале программы понадобится объявить выражение _GNU_SOURCE
.
- Какие основные системные вызовы используются для создания/открытия/чтения/записи/закрытия файла?
- Что такое файловый дескриптор?
- Где хранятся файловые дескрипторы?
- Что такое системный вызов?
- Какие средства обработки ошибок системных вызовов существуют?
Для защиты работы необходимо показать написанные программы cat
, cp
и ls
и ответить на вопросы по теме работы.