Область индексных дескрипторов
Это массив описаний файлов, называемых i-узлами (i-node)
Средства разработки программ. Компилятор, средства разработки и отладки программ.
Система UNIX обеспечивает богатый набор средств для разработки программ, включающий компиляторы, линкер, символьный отладчик, средства ведения программных проектов и разработки языковых процессоров, архивные средства и другие.
Компиляторы
СС Cи Компилятор
$ cc t.c файл с программой
$ ./a.out результат вышенаписанного – созданный исполняемый файл
$ cc -о t t.c t-имя исполняемого файла
$ ./t
-l<библиотека> подключить библиотеку
-L<пусто> путь, где хранится библиотека
-I<пусто> указываются каталоги для поиска файлов, заданных #include <Ф.h>
-D name [=def ] задается макрос
-g добавить отладочную информацию
gdb отладчик
strip чистит отладочную информацию
-с сделать только объектный файл
-О задать уровень оптимизации
-shared подключает разделяемые библиотеки
-static подключает статические библиотеки
-fPIC генерируется позиционно-независимый код (для создания разделяемых библиотек)
Отладка программ
Необходима для разрешения ошибок алгоритмов, в частности, зацикливания, неправильного формирования индекса массива и значения указателя (утечка памяти), неверных значений переменных.
Отладка без отладчикаЕсли отладчик недоступен, используется выдача отладочной информации (значения переменных, этапы выполнения) в файл или стандартный выход. Для того, чтобы отладочную информацию впоследствии не пришлось очищать, используются инструкции препроцессора.
ОтладчикФункции отладчика: • пошаговое выполнение программы • выдача значений переменных • запуск программы • установка точек прерывания • продолжение выполнения
Отладчик gdb
cc –g …
gdb <имя исполняемого кода>
Далее функционирует отладчик в режиме командной строки.
help - помощь
run – запуск программы
break – установка точек прерывания
break <№строки исх. кода>
break <имя функции>
break main отладка с самого начала
continue – продолжить выполнение до следующей точки прерывания или до конца
step – пошаговое выполнение с заходом в функции
next – пошаговое выполнение без захода в функции
print <имя переменной> - выдача значений переменнох
Отладка готового кода
strace – трассирует системные вызовы программ
strace <имя исполняемого кода>
strace –p <№ процесса>
Системный вызов ptrace (один из способов взаимодействия процессов) позволяет родительскому процессу управлять выполнением порожденных, а также исследовать и менять данные в образе процессов и значения регистров
ptrace(<действие>, <№процесса>, <адрес>, <данные>)
Действия:
PTRACE_ATTACH подцепиться к процессу
PTRACE_DETACH отцепиться
PTRACE_TRACEME
PTRACE_KILL уничтожение
PTRACE_PEEKTEXT вернуть данные, записанные в адресе в области текста
PTRACE_PEEKDATA вернуть данные, записанные в адресе в области данных
PTRACE_CONT продолжить выполнение
PTRACE_SINGLSTEP
PTRACE_SYSCALL
Выполнение отладчика и отлаживаемой программы синхронизируется с помощью сигналов.
Системные вызовы для управления файлами. Открытие, чтение, запись, позиционирование, управление дескрипторами.
В операционной системе UNIX весь ввод и вывод осуществляется посредством чтения файлов или их записи, потому что все периферийные устройства, включая даже терминал пользователя, являются файлами определенной файловой системы. Это означает, что один однородный интерфейс управляет всеми связями между программой и периферийными устройствами. Когда интерпретатор команд ("shell") прогоняет программу, он открывает три файла, называемые стандартным вводом, стандартным выводом и стандартным выводом ошибок, которые имеют соответственно числа 0, 1 и 2 в качестве дескрипторов этих файлов. В нормальном состоянии все они связаны с терминалом, так что если программа читает с дескриптором файла 0 и пишет с дескрипторами файлов 1 и 2, то она может осуществлять ввод и вывод с помощью терминала, не заботясь об открытии соответствующих файлов.
Пользователь программы может перенаправлять ввод и вывод на файлы, используя операции командного интерпретатора shell "<" и ">" : prog <infile>outfile
API для работы с файлами (open, access, write, read, close, chmod, chown, link, unlink,lseek, fcntl).
open – открывает файл или устройство
access –rwx <имя файла> - устанавливает права доступа к файлу
close – функция, закрывающая описатель файла
chmod – изменяет права доступа к файлу
chown – измняет владельца и группу-владельца файла
link <oldpath> <newpath>–создает новое имя файла (жесткая ссылка)
unlink <имя>– удаляет имя и файл, на который оно ссылается
lseek <descriptor><offset><whence>– устанавливает позицию чтения/записи информации в файле
write(fd,buf,count) выполняет запись указанного в count количества байт данных, начиная с адреса buf, в файл с дескриптором fd.
fcntl – функция для работы с файловыми описателями.
fcntl(fildes,cmd,arg)
int fildes,cmd,arg;
Функция fcntl обеспечивает выполнение набора разнообразных операций по отношению к открытым файлам, идентифицируемым с помощью дескриптора fildes. Параметры cmd и arg интерпретируются следующим образом (определение буквенных констант хранится в файле "/usr/include/fcntl.h"):
F_DUPFD вернуть наименьшее значение дескриптора, большее или равное значению arg
F_SETFD установить флаг "close-on-exec" в младшем разряде arg (файл будет закрыт функцией exec)
F_GETFD вернуть состояние флага "close-on-exec"
F_SETFL установить флаги, управляющие состоянием файла (O_NDELAY - не приостанавливаться в ожидании завершения ввода-вывода, O_APPEND - записываемые данные добавлять в конец файла)
F_GETFL получить значения флагов, управляющих состоянием файла
struct flock
short l_type; /* F_RDLCK - блокировка чтения,
F_WRLCK - блокировка записи,
F_UNLCK - снятие блокировки */
short l_whence; /* адрес начала блокируемого участка дается в виде смещения относительно начала файла (0), относительно текущей позиции указателя (1), относительно конца файла (2) */
long l_start; /* смещение в байтах, интерпретируемое в соответствии со значением l_whence */
long l_len; /* длина блокируемого участка в байтах. Если указан 0, блокируется участок от l_start до конца
файла */
long l_pid; /* идентификатор процесса, блокирующего файл */
long l_sysid; /* системный идентификатор процесса, блокирующего файл */
F_GETLK прочитать первый код блокировки, мешающей использовать значение arg и затирать его. Если блокировка отсутствует, поменять значение l_type в arg на F_UNLCK
F_SETLK установить или снять блокировку файла в зависимости от значения arg. В случае невозможности установить блокировку вернуть -1
F_SETLKW установить или снять блокировку содержащихся в файле данных в зависимости от значения arg. В случае невозможности установить блокировку приостановить выполнение