
- •Лабораторная работа № 1 аргументы и опции программы. Функция getopt(). Знакомство с отладчиком gdb
- •Программа выполнения работы.
- •Отладчик gdb
- •Компиляция для отладки
- •Вход-выход
- •Команды gdb
- •Получение справки
- •Начало выполнения отлаживаемой программы
- •Настройки среды
- •Рабочий каталог отлаживаемой программы
- •Ввод и вывод отлаживаемой программы
- •Часто используемые команды
- •Варианты заданий
- •Контрольные вопросы.
- •Составить отчет
- •Варианты заданий.
- •Контрольные вопросы
- •Лабораторная работа № 3 ввод/вывод в linux. Обработка ошибок
- •Программа работы
- •Составить отчет Краткая теория.
- •Системные вызовы
- •Обработка ошибок.
- •Варианты заданий
- •Варианты:
- •Контрольные вопросы
- •Составить отчет.
- •Варианты заданий
- •Составить отчет.
- •Варианты заданий.
- •Составить отчет. Краткая теория.
- •Создание и удаление каталогов
- •Чтение каталогов
- •Варианты заданий.
- •Контрольные вопросы.
Варианты заданий
1. Программа принимает опции –а, -b, -c:
опция –b требует обязательного наличия единственного аргумента;
для завершения обработки опций принимается --;
количество обычных аргументов не ограничено (в рамках допустимого операционной системой);
2. Программа принимает опции –с, -d, -f:
опция –f требует обязательного наличия единственного аргумента;
для завершения обработки опций принимается --;
количество обычных аргументов не ограничено (в рамках допустимого операционной системой).
3. Программа принимает опции –a, -b, -c, -d;
опции –a и –b несовместимы;
для завершения обработки опций принимается --;
количество обычных аргументов не ограничено (в рамках допустимого операционной системой).
4. Программа принимает опции –a, -b, -с:
опция –a несовместима ни с одной опцией;
для завершения обработки опций принимается "—";
количество обычных аргументов не ограничено (в рамках допустимого операционной системой).
5. Программа принимает опции –a, b, c, -d:
опция –a несовместима с опцией –b, а опция -с несовместима с опцией -d;
для завершения обработки опций принимается "—";
количество обычных аргументов не ограничено (в рамках допустимого операционной системой).
6. Программа принимает опции –a, -b, -c:
опции –b и –с могут иметь по одному аргументу;
для завершения обработки опций принимается --. Количество обычных аргументов не ограничено (в рамках допустимого операционной системой).
Контрольные вопросы.
Что такое аргументы программы? Зачем они нужны?
Что такое Опции? Какова их функция? Опишите виды опций
Что такое Getopt()? Где описана эта функция и каково ее применение.
Какие переменные предназначены для чтения аргументов?
Что такое исходный файл(исходник)? Как его создать?
Как скомпилировать программу в Linux? Какие компиляторы вы знаете?
Что такое объектный модуль? Для чего он создается?
Что такое отладчик gdb? Назовите и опишите основные его команды.
ЛАБОРАТОРНАЯ РАБОТА № 2
РАБОТА С ОКРУЖЕНИЕМ
Цель работы: изучить команды для работы с окружением. Научиться создавать, изменять и очищать переменные окружения.
Программа выполнения работы.
Написать программу, которая осуществляет изменение окружения.
Откомпилировать ее, и показать преподавателю.
Составить отчет
Краткая теория.
Окружение(environment)- это набор специфических для конкретного пользователя пар ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. Каждый процесс имеет свою копию окружения и свободно ей распоряжается ею. Чтобы посмотреть что представляет собой окружения, введите в командной строке(или в терминале) команду: $env
В современных Linux-дистрибутивах окружение представлено многими переменными, но более часто используются только некоторые из них:
USER- имя пользователя;
HOME- домашний каталог;
PATH- список каталогов, в которых осуществляется поиск исполняемых файлов программ;
SHELL- используемая командная оболочка;
PWD- текущий каталог;
В C/C++ так можно обрабатывать окружение. Читать окружение можно двумя способами:
С помощью внешней переменной ENVIRON, представляющая собой массив строк ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. Эта переменная объявлена в заголовочном файле UNISTD.H
При помощи функции getevn(), которая возвращает значение указанной переменной окружения. Эта функция объявлена в заголовочном файле STDLIB.H.
Функция getevn() имеет следующий прототип:
char *getevn (char*VAR_NAME);
Переменная возвращает значение указанной переменной VAR_NAME. Если таковой переменной не существует, то вернётся значение NULL.
Пример работы с переменной environ.
#include <stdio.h>
#include <unistd.h>
extern char **environ;
int main()
{int i;
for(i=0;environ[i]!=NULL;i++)
printf(“%s\n”, environ[i]);
return 0;
}
Пример программы с функции getevn().
#include<stdio.h>
int main(int arvc, char **argv)
{char * value;
if(argc<2)
{printf(“Ошибка! Нужно больше аргументов!”);
return 1;
}
value= (char*) getevn(argv[1]);
if(value=NULL)
printf(“%s не найден”, value);
else
printf(“%s=%s\n”, argv[1],value);
return 0;}
При работе с окружением может возникнуть потребность изменить некоторые переменные. На практике модификации окружения осуществляется с помощью функций setenv(), putenv() и unsetenv(), которые объявлены в заголовочном файле STDLIB.H.
Прототипы функции:
int setenv(conts char *NAME, const char *VALUE, int OV);
int putenv(char *INITSTR);
int unstenv(const char* NAME);
Функция setenv() добавляет новую или изменяет существующую переменную окружения с именем NAME, присваивая значения VALUE. OV –флаг перезаписи, показывающий, нужно ли перезаписывать переменную или нет. Если он будет равен нулю, то переменная перезаписывается, иначе остаётся неизменной.
Функция putenv() добавляет новую или изменяет уже существующую переменную окружения, используя строку инициализации INITSTR в формате ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. Следует отметить, что эта функция есть не во всех UNIX-подобных системах, что может сказаться на переносимости.
Функция unsetenv() удаляет переменную с именем NAME из окружения.
Все данные функции возвращают значение 0 при удачном завершении работы и значение -1, если произошла ошибка.
Рассмотрим примеры с каждой из функций.
Пример 1. Setenv().
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{ int ov_flag=1;
char *var;
if(argc<3)
{printf(“Ошибка! Мало аргументов\n”); return 1;}
setenv(argv[1],argv[2],ov_flag);
var=getenv(argv[1]);
if(var==NULL)
printf(“Переменная не найдена\n”);
else printf(“%s=%s”,argv[1],var );
return 0;}
Пример 2. Putenv().
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{ char *var;
char initvar[1024];
if(argc<3)
{printf(“Ошибка! Мало аргументов\n”); return 1;}
sprintf(initvar,”%s=%s”, argv[1],argv[2]);
putenv(initvar);
var=getenv(argv[1]);
if(var==NULL)
printf(“Переменная не найдена\n”);
else printf(“%s=%s”,argv[1],var );
return 0;}
Пример 3. Unsetenv().
#include <stdio.h>
#include <unistd.h>
extern char **environ;
int main(int argc, char **argv)
{ int i;
if(argc<2)
{printf(“Ошибка! Мало аргументов\n”); return 1;}
if(unsetenv(argv[1])!=0)
{printf(“Ошибка! Переменная не удалена\n”); return 1;}
for(i=0; environ[i]!=NULL;i++)
printf(“%s\n”, environ[i]);
return 0;}