Лабораторная работа "Системные вызовы для работы с файлами" - efanov/mephi GitHub Wiki

Содержание

Общие сведения

Изучаемые системные вызовы: open, close, read, write, getdents.

При выполнении работы активно используйте man(2) для выяснения значения параметров системных вызовов, особенностей их работы и правильной обработки ошибок.

Задания

Напишите указанные программы, чтобы они повторяли функциональность одноимённых стандартных программ. В задачах необходимо использовать изучаемые системные вызовы везде, где это возможно.

cat

Программа должна выводить сконкатенированное символом переноса строки (\n) содержимое файлов, имена которых переданы ей на вход в качестве аргументов командной строки.

  • Количество аргументов произвольно.
  • Некоторые файлы могут не существовать: порядок действий в этом случае определите сами.
  • Файлы текстовые, могут быть пустыми.

Пример ожидаемой работы программы:

echo "file1 content." > file1

echo "file2 content." > file2

./cat file1 file2
# Вывод:
# file1 content.
# file2 content.

cp

Программа должна копировать содержимое одного файла в другой файл.

  • Имена файлов передаются в качестве аргументов командной строки.
  • Если файла назначения не существует, его необходимо создать.
  • Копируемого файла может не существовать.
  • Копируемый файл текстовый, может быть пустым.

Пример ожидаемой работы программы:

echo "file1 content." > file1

./cp file1 file2

cat file2
# Вывод:
# file1 content.

ls

Программа должна выводить содержимое директории.

  • Директория может быть передана аргументом командной строки.
  • Если директория не указана, выводится содержимое текущей директории.
  • Содержимое директории — список файлов в ней, разделённый символом переноса строки.

Пример ожидаемой работы программы:

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.

Допуск

  1. Какие основные системные вызовы используются для создания/открытия/чтения/записи/закрытия файла?
  2. Что такое файловый дескриптор?
  3. Где хранятся файловые дескрипторы?
  4. Что такое системный вызов?
  5. Какие средства обработки ошибок системных вызовов существуют?

Порядок защиты работы

Для защиты работы необходимо показать написанные программы cat, cp и ls и ответить на вопросы по теме работы.

⚠️ **GitHub.com Fallback** ⚠️