Системное программирование, файловый ввод-вывод
Все программы должны соответствовать принятому стилю кодирования.
- В начале файла - заголовок с автором и лицензией;
- Перед каждой функцией - комментарий с описанием функции и аргументов;
- Текст программы разбит на "абзацы" с комментарием перед каждым "абзацем".
Все возвращаемые функциями значения должны проверяться. В случае ошибок выполнение программы должно аварийно завершаться с выдачей сообщения об ошибке и кодом завершения EXIT_FAILURE.
3. Файловый ввод-вывод
- С помощью функции open() открыть файл для чтения (O_RDONLY). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
- Проверить, что получится, если открыть с помощью программы из предыдущего примера:
- несуществующий файл;
- существующий файл без прав на чтение (/etc/shadow);
- существующий файл с правами на чтение (/etc/passwd).
- С помощью функции open() открыть файл для записи (O_WRONLY). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
- Проверить, что получится, если открыть с помощью программы из предыдущего примера:
- несуществующий файл;
- существующий файл без прав на запись (/etc/passwd);
- существующий файл с правами на запись.
- С помощью функции open() открыть файл для чтения и записи (O_RDWR). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
- Проверить, что получится, если открыть с помощью программы из предыдущего примера:
- несуществующий файл;
- существующий файл без прав на чтение (/etc/shadow);
- существующий файл без прав на запись (/etc/passwd);
- существующий файл с правами на запись.
- С помощью функции open() открыть файл для записи, если файл не существует - создавать с правами "чтение и запись для владельца, чтение для группы, чтение для остальных" (O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
- Проверить, что получится, если открыть с помощью программы из предыдущего примера:
- несуществующий файл;
- существующий файл без прав на запись (/etc/passwd);
- существующий файл с правами на запись.
- С помощью функции open() создавать файл для записи с правами "чтение и запись для владельца, чтение для группы, чтение для остальных", если файл уже существует - аварийно завершать работу программы (O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
- Проверить, что получится, если открыть с помощью программы из предыдущего примера:
- несуществующий файл;
- существующий файл без прав на запись (/etc/passwd);
- существующий файл с правами на запись.
- С помощью функции open() открыть файл для записи, удалив его содержимое (т.е. урезать длину файла до нуля) (O_WRONLY | O_TRUNC). Имя файла получать из командной строки. Проверять результат, при возникновении ошибки выводить сообщение об ошибке с помощью функции perror()
- Проверить, что получится, если открыть с помощью программы из предыдущего примера:
- несуществующий файл;
- существующий файл без прав на запись (/etc/passwd);
- существующий файл с правами на запись.
- С помощью функции write() записать в стандартный вывод (STDOUT_FILENO) строку "Hello, world!\n". STDOUT_FILENO определено в unistd.h.
- С помощью функции read() прочитать из стандартного ввода (STDIN_FILENO) не более 1024 байт. Вывести количество прочитанных байт.
- Проверить, что при работе программы из предыдущего примера при чтении с терминала read() возвращает порцию данных сразу после нажатия Enter, не дожидаясь конца файла (Ctrl-D).
- Модифицировать программу из предыдущего примера так, чтобы чтение продолжалось до конца файла (пока read() не возвратит 0).
- Проверить работу модифицированной программы при чтении с терминала и из файла размером больше 1024 байт (/etc/passwd).
- Добавить закрытие файла (функция close()) в пример 3.1
- Реализовать программу, которая с использованием параметров командной строки получает имя файла и строку, открывает указанный файл для добавления, добавляет строку в конец файла, закрывает файл.
- Реализовать программу, которая с использованием параметров командной строки получает имя файла и смещение, открывает файл для записи, перемещает указатель текущей позиции на указанное смещение от начала, и записывает в файл один произвольный байт. Для преобразования строки в число использовать функцию strtoll().
- Модифицировать программу из предыдущего примера. После открытия файла создать дубликат файлового дескриптора, после позиционирования и записи одного байта получить текущую позицию используя дублирующий файловый дескриптор.
- Реализовать пример с использованием функции fsync()
- Реализовать пример с использованием функции fdatasync()
- Реализовать пример с использованием функции sync()