
- •Лабораторная работа № 1 аргументы и опции программы. Функция getopt(). Знакомство с отладчиком gdb
- •Программа выполнения работы.
- •Отладчик gdb
- •Компиляция для отладки
- •Вход-выход
- •Команды gdb
- •Получение справки
- •Начало выполнения отлаживаемой программы
- •Настройки среды
- •Рабочий каталог отлаживаемой программы
- •Ввод и вывод отлаживаемой программы
- •Часто используемые команды
- •Варианты заданий
- •Контрольные вопросы.
- •Составить отчет
- •Варианты заданий.
- •Контрольные вопросы
- •Лабораторная работа № 3 ввод/вывод в linux. Обработка ошибок
- •Программа работы
- •Составить отчет Краткая теория.
- •Системные вызовы
- •Обработка ошибок.
- •Варианты заданий
- •Варианты:
- •Контрольные вопросы
- •Составить отчет.
- •Варианты заданий
- •Составить отчет.
- •Варианты заданий.
- •Составить отчет. Краткая теория.
- •Создание и удаление каталогов
- •Чтение каталогов
- •Варианты заданий.
- •Контрольные вопросы.
Варианты заданий
Написать программу, которая получает и выводит информацию об указанном файле. Тип информации: тип файла, его индекс.дескриптор.
Написать программу, которая получает и выводит на экран информацию об указанном файле. Тип информации: тип файла, дата последнего его изменения, размер файла.
Написать программу, которая получает и выводит на экран информацию об указанном файле. Тип информации: все три времени изменения файла.
Написать программу, которая получает и выводит на экран информацию об указанных файлах, указать 2 файла. Тип информации: тип файла, индекс.дескриптор, идентификатор владельца файла, атрибуты файла .
Написать программу, которая получает и выводит на экран информацию об указанных файлах, указать 3 файла. Тип информации: три времени изменения файла, идентификатор владельца и группы, атрибуты файла.
Написать программу, которая получает и выводит на экран информацию об указанном файле. Тип информации: вся возможная информация.
Контрольные вопросы
Что такое функция stat()? Для чего она нужна?
Чем отличаются stat( ) и lstat()?
Какие типы файлов вы знаете?
ЛАБОРАТОРНАЯ РАБОТА № 5
ОПЕРАЦИИ НАД ФАЙЛАМИ
Цель работы: освоить функции переименования, перемещения и удаления файла, смена прав доступа.
Программа выполнения работы.
Изучить функции работы над файлами. Разобрать пример из методички.
Написать программу согласно своему варианту.
Скомпилировать и продемонстрировать работу преподавателю
Составить отчет.
Краткая теория.
Файл-это комплексное понятие, состоящее из таких компонентов, как данные, индексы и ссылки. Реальные файловые системы обычно располагаются на блочных устройствах. Данные таких устройств в действительности адресуются блоками фиксированного размера, а не отдельными байтами.
Индексы - это специальные ячейки памяти, зарезервированные файловой системой для разделения смешанных в одну кучу данных на отдельные структурные единицы, которые называются файлами. Индексы содержат информацию о том, в каких блоках файловой системы хранятся данные конкретного файла. В индексах так же содержится дата последнего доступа/модификации файла.
Ссылки - это привычное для нас отображение файлов в файловой системе. Можно условно сказать что ссылки являются именами индексных узлов файловой системы. Каталоги можно рассматривать как особые файлы, предназначенные для хранения ссылок.
Ссылки в Linux бывают двух видов:
жесткие ссылки (прямые)
символические ссылки.
Для создания ссылок используются функции link() и symlink(), описанные в заголовочном файле unistd.h:
int link(const char * FROM, const char *TO);
int symlink(const char * FROM, const char *TO);
Обе функции возвращают значение ноль при удачном завершении, или значение -1, если произошла ошибка. Аргументы From и TO аналогичны свободным аргументам команды ln оболочки Linux.
Операции над файлами заключаются в использовании нескольких функций: удаления, перемещения, переименования, а так же создание ссылок и создания и удаления каталогов.
Для удаления файла служит системный вызов unlink(), объявленный в заголовочном файле unistd.h следующим образом:
int unlink(char * FNAME);
Аргумент функции FNAME- имя удаляемого файла. Функция возвращает значение 0 при удачном завершении и -1, если произошла ошибка.
Примечание: для удаления каталогов используется функция rmdir().
Так же существует еще одна функция удаления remove(), объявленная в библиотеке stdio.h таким образом:
int remove (char * PATHNAME);
Аргумент PATHNAME –это имя удаляемого элемента. Функция remove() возвращает 0, если файл успешно удален. Возвращаемое значение -1 свидетельствует об ошибке. Данная функция способна удалить любой файл(каталог, ссылку и обычный файл).
Пример 1. Удаления файла с использованием обоих функций
#include <unistd.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
if (argc<3)
{fprintf(stderr,”Ошибка.! Мало аргументов\n”);
return 1;
}
if (unlink(argv[1])==-1)
{
fprintf(stderr,”Не удалось удалить файл\n”); return 1;
}
if(remove(argv[2])==-1)
{ fprintf(stderr,”Не удалось удалить файл\n”); return 1;
}
return 0;}
Для перемещения/переименования файла существует функция rename(). Прототип функции находится в заголовочном файле stdio.h:
int rename(const char * OLDF, const char * NEWF);
Аргумент OLDF-имя файла, который нужно переместить/переименовать, а NEWF- имя нового файла. При успешном завершении функция возвращает значение 0 и значение -1, если произошла ошибка.
Пример 2. Переименование файла
#include <stdio.h>
int main(int argc, char ** argv)
{
if (argc<3)
{fprintf(stderr,”Ошибка! Мало аргументов\n”); return 1;
}
if (rename(argv[1],argv[2])==-1)
{ fprintf(stderr,”Ошибка! \n”); return 1;}
return 0;}
Примечание: Открытые файл никак не влияет на функцию перемещение/переименование.
В процессе работы может потребоваться создание или удаление каталогов. Для этого существуют две функции.
Функция создания каталога mkdir(), объявленная в заголовочном файле sys\types.h, имеет вид:
int mkdir(const char * NAME, mode_t MODE);
NAME - имя нового каталога. MODE – передаваемые новому каталогу атрибуты (права доступа). Функция возвращает 0 при удачно завершении работы, и -1, если произошла ошибка.
Пример 3. Создание каталога.
#include <stdio.h>
#include <sys/tipes.h>
#include <sys\stat.h>
int main(int argc, char **argv){
mode_t mode=0777;
if(argc<2){
fprintf(stderr,”Ошибка! мало аргументов\n”); return 1;}
if(mkdir(argv[1],mode)==-1)
{fprintf(stderr,”Ошибка создания каталога\n”); return 1;}
return 0;}
Данная программа будет работать не так, как ожидается. Каталогу присвоятся не все права доступа, которые мы хотели бы. Это связано с тем, что каждому процессу в Linux привязана маска прав доступа, которая передается дочерним процессам. Маска прав доступа- это число, представляющее собой набор битов прав доступа, которые никогда не будут устанавливаться для создаваемых процессом файлов и каталогов. Команда оболочки Linux umask позволяет узнать текущую маску прав доступа.
Программа может сама изменить маску прав доступа текущего процесса при помощи системного вызова umask(), объявленного в заголовочном файле \sys\types.h:
mode_t umask(mode_t MASK);
Этот системный вызов изменит текущую маску прав доступа и возвращает предыдущее значение маски.
Пример 4. Создание каталога с использование umask().
#include <stdio.h>
#include <sys/tipes.h>
#include <sys\stat.h>
int main(int argc, char **argv){
mode_t mode=0777;
if(argc<2){
fprintf(stderr,”Ошибка! мало аргументов\n”); return 1;}
umask(0000);
if(mkdir(argv[1],mode)==-1)
{fprintf(stderr,”Ошибка создания каталога\n”); return 1;}
return 0;}
Удаление каталога возможно двумя функциями. Функцией remove(), рассмотренной ранее, и функцией rmdir(), объявленной в библиотеке unistd.h:
int rmdir(const char * DIR);
Аргумент DIR является именем удаляемого файла. Функция возвращает значение 0 при удачном завершении и -1, если произошла ошибка. Данный системный вызов удаляет только пустые каталоги. Если каталог не пуст, то функция завершится неудачей.
Пример 5. Удаление каталога.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{if(argc<2)
{ fprintf(stderr,”Ошибка! мало аргументов\n”); return 1;
}
if(mkdir(argv[1])==-1)
{fprintf(stderr,”Ошибка удаления каталога\n”); return 1;}
return 0;}
Для смены прав доступа применяют системные вызовы семейства chmod(), объявленные в заголовочном файле sys\types.h:
int chmod(const char * FNAME, mode_t MODE);
где FNAME –имя файла, а MODE- новые атрибуты, которые нужно задать файлу. Данный вызов возвращает значение 0 при удачном завершении и -1, если произошла ошибка.