(c) Larry Ewing, Simon Budig, Garrett LeSage
с 1994 г.

Кафедра Информатики и Математического Обеспечения

ПетрГУ | ИМиИТ | О кафедре | Проекты | Лаборатория ИТС | Семинары НФИ/AMICT
Сотрудники | Учебный процесс | Табель-календарь | Курсовые и выпускные работы
Вычислительные ресурсы | Публикации | Архив новостей | Контактная информация (English)

Системное программирование, файловый ввод-вывод

Все программы должны соответствовать принятому стилю кодирования.

Все возвращаемые функциями значения должны проверяться. В случае ошибок выполнение программы должно аварийно завершаться с выдачей сообщения об ошибке и кодом завершения EXIT_FAILURE.

3. Файловый ввод-вывод

  1. С помощью функции open() открыть файл для чтения (O_RDONLY). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
  2. Проверить, что получится, если открыть с помощью программы из предыдущего примера:
    • несуществующий файл;
    • существующий файл без прав на чтение (/etc/shadow);
    • существующий файл с правами на чтение (/etc/passwd).
  3. С помощью функции open() открыть файл для записи (O_WRONLY). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
  4. Проверить, что получится, если открыть с помощью программы из предыдущего примера:
    • несуществующий файл;
    • существующий файл без прав на запись (/etc/passwd);
    • существующий файл с правами на запись.
    Файл с правами на запись создайте самостоятельно (cal -m 2010 > c.txt).
  5. С помощью функции open() открыть файл для чтения и записи (O_RDWR). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
  6. Проверить, что получится, если открыть с помощью программы из предыдущего примера:
    • несуществующий файл;
    • существующий файл без прав на чтение (/etc/shadow);
    • существующий файл без прав на запись (/etc/passwd);
    • существующий файл с правами на запись.
    Файл с правами на запись создайте самостоятельно (cal -m 2010 > c.txt).
  7. С помощью функции open() открыть файл для записи, если файл не существует - создавать с правами "чтение и запись для владельца, чтение для группы, чтение для остальных" (O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
  8. Проверить, что получится, если открыть с помощью программы из предыдущего примера:
    • несуществующий файл;
    • существующий файл без прав на запись (/etc/passwd);
    • существующий файл с правами на запись.
    Файл с правами на запись создайте самостоятельно (cal -m 2010 > c.txt).
  9. С помощью функции open() создавать файл для записи с правами "чтение и запись для владельца, чтение для группы, чтение для остальных", если файл уже существует - аварийно завершать работу программы (O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
  10. Проверить, что получится, если открыть с помощью программы из предыдущего примера:
    • несуществующий файл;
    • существующий файл без прав на запись (/etc/passwd);
    • существующий файл с правами на запись.
    Файл с правами на запись создайте самостоятельно (cal -m 2010 > c.txt).
  11. С помощью функции open() открыть файл для записи, удалив его содержимое (т.е. урезать длину файла до нуля) (O_WRONLY | O_TRUNC). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
  12. Проверить, что получится, если открыть с помощью программы из предыдущего примера:
    • несуществующий файл;
    • существующий файл без прав на запись (/etc/passwd);
    • существующий файл с правами на запись.
    Файл с правами на запись создайте самостоятельно (cal -m 2010 > c.txt).
  13. С помощью функции write() записать в стандартный вывод (STDOUT_FILENO) строку "Hello, world!\n". STDOUT_FILENO определено в unistd.h.
  14. С помощью функции read() прочитать из стандартного ввода (STDIN_FILENO) не более 1024 байт. Вывести количество прочитанных байт.
  15. Проверить, что при работе программы из предыдущего примера при чтении с терминала read() возвращает порцию данных сразу после нажатия Enter, не дожидаясь конца файла (Ctrl-D).
  16. Модифицировать программу из предыдущего примера так, чтобы чтение продолжалось до конца файла (пока read() не возвратит 0).
  17. Проверить работу модифицированной программы при чтении с терминала и из файла размером больше 1024 байт (/etc/passwd).
  18. Добавить закрытие файла (функция close()) в пример 3.1
  19. Реализовать программу, которая с использованием параметров командной строки получает имя файла и строку, открывает указанный файл для добавления, добавляет строку в конец файла, закрывает файл.
  20. Реализовать программу, которая с использованием параметров командной строки получает имя файла и смещение, открывает файл для записи, перемещает указатель текущей позиции на указанное смещение от начала, и записывает в файл один произвольный байт. Для преобразования строки в число использовать функцию strtoll().
  21. Модифицировать программу из предыдущего примера. После открытия файла создать дубликат файлового дескриптора, после позиционирования и записи одного байта получить текущую позицию используя дублирующий файловый дескриптор.
  22. Реализовать пример с использованием функции fsync()
  23. Реализовать пример с использованием функции fdatasync()
  24. Реализовать пример с использованием функции sync()