65828

Основы работы в среде операционной системы UNIX

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы — изучение среды операционной системы (ОС) UNIX, возможностей программирования командного интерпретатора SHELL, а также принципов работы с неинтерактивным текстовым редактором SED.

Русский

2014-08-06

65.5 KB

0 чел.

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

—————————

Кафедра информационной безопасности компьютерных систем

ОТЧЕТ

по лабораторной работе №1

«Основы работы в среде операционной системы UNIX»

по курсу «Операционные системы»

Студент:

Никитин А. С.

гр. 2088/1

Преподаватель:

Степанова Т. В.

Санкт-Петербург — 2011

1. Формулировка задания

Цель работы — изучение среды операционной системы (ОС) UNIX, возможностей программирования командного интерпретатора SHELL, а также принципов работы с неинтерактивным текстовым редактором SED.

2. Использованные теоретические сведения

3. Результаты работы

3.1. Выполнение примеров

  1.  Выполнить создание, запуск и отладку программы, представленной в примере 1.
    Были созданы исходные файлы, представленные в примере. Для создания объектных файлов был использован компилятор
    gcc:
    gccc main.c
    gccc reciprocal.cpp
    Так как второй файл был написан на C++, то для связи объектных файлов и библиотек использовался компилятор g++:
    g++ -o reciprocal main.o reciprocal.o
    Запуск программы показал, что она была создана успешно:
    ./reciprocal 9
    The reciprocal of 9 is 0.111111
    Для проведения отладки программы на стадии компиляции в неё была добавлена служебная информация для отладчика. Это было выполнено компиляцией с ключом g:
    gccgc main.c
    gccgc reciprocal.cpp
    g++ -g -o reciprocal main.o reciprocal.o
    Затем отладчик был запущен командой gdb reciprocal.
    После запуска программы без параметров произошла ошибка сегментации. Команда where показала место ошибки:
    #0  0x002997bc in ?? () from /lib/tls/i686/cmov/libc.so.6
    #1  0
    x00299520 in strtol () from /lib/tls/i686/cmov/libc.so.6
    #2  0
    x00296891 in atoi () from /lib/tls/i686/cmov/libc.so.6
    #3  0
    x0804854d in main (argc=1, argv=0xbffff4a4) at main.c:6
    С помощью команды up 3 была найдена строка в файле main.c, которая привела к ошибке:
    #3  0x0804854d in main (argc=1, argv=0xbffff4a4) at main.c:6
    6  i = atoi(argv[1]);
    Для выяснения причины ошибки было просмотрено содержимое переменной argv[1]:
    print argv[1]
    $1 = 0
    x0
    Установка контрольной точки была выполнена командой break main.
    После запуска программа останавливается на первой строке файла
    main.c:
    run 9
    Starting program: /home/user/Share/labs/lab_1/example_1/reciprocal 9

    Breakpoint 1, main (argc=2, argv=0xbffff494) at main.c:6
    6  
    i = atoi(argv[1]);
    Далее были использованы команды, предназначенные для пошагового выполнения программы:
    next
    7  
    printf("The reciprocal of %d is %g\n", i, reciprocal(i));
    step
    reciprocal (i=9) at reciprocal.cpp:5
    5  
    assert(i != 0);
    continue
    Continuing.
    The reciprocal of 9 is 0.111111
    Program exited normally.
  2.  Выполнить создание makefile для проекта, представленного в примере 2, и генерацию исполняемого файла проекта под управлением утилиты make.
    Созданы файлы со следующим содержанием:
    main.с

    #include <stdio.h>
    int main(int argc, char *argv[]) {
    puts("main() from main.c");
    create();
    return 0;
    }

    create.c

    #include <stdio.h>

    void create() {
    puts("create() from create.c");
    update();
    return;
    }

    update.c

    #include <stdio.h>
    #include "update.h"

    void update() {
    puts(upd);
    return;
    }

    update.h

    #ifndef UPDATE
    #define UPDATE
    char *upd = "This string defined in update.h";
    #endif

    makefile

    CC= gcc
    LDFLAGS= -Wl,-Map,mapfile
    baseline: main.o create.o update.o
    $(
    CC) $(LDFLAGS) -o baseline main.o create.o update.o
    main.o: main.c
    create.o: create.c
    update.o: update.c update.h
    После запуска утилиты make была сгенерирована программа baseline. Запуск программы подтвердил её работоспособность:
    main() from main.c
    create() from create.c
    This string defined in update.h
  3.  Составить makefile для трансляции проекта, исходные файлы которого указаны в Табл.3.
    CC = gcc #компилятор
    FLAGS =  #флаги
    PROG = myprog #имя конечного файла
    TOOLLIB = ./tool  #директория библиотеки tool
    SUBDIRS = ./tool ./module1  #поддиректории, где есть makefile
    OBJDIRS = ./module1 #директории, где есть объектные файлы
       #необходимые для сборки проекта
    INCLUDE = -I./tool -I./module1 -I../include #директории с .h
    LIBFILES = ../lib/elib.a tool.a  #файлы библиотек
    OBJC = $(patsubst %.c, %.o, $(wildcard ./*.c)) #объектные файлы
            #получающиеся из *.
    c
    OBJS = $(patsubst %.s, %.o, $(wildcard ./*.s)) #объектные файлы
            #получающиеся из *.
    s
    OBJ = $(OBJC) $(OBJS)  #объектные файлы для удаления
    all: subdirs $(OBJ)
    $(
    CC) $(FLAGS) -o $(PROG) $(INCLUDE) $(LIBS) $(OBJ) $(foreach DIR, $(OBJDIRS), $(wildcard $(DIR)/*.o)) $(LIBFILES)
    fun1.o:
    $(
    CC) $(FLAGS) $(INCLUDE) -c fun1.c
    fun2.o:
    $(
    CC) $(FLAGS) $(INCLUDE) -c fun2.s
    main.o:
    $(
    CC) $(FLAGS) $(INCLUDE) -c main.c
    subdirs:
    for s in $(SUBDIRS);\
    do\
     
    cd $$s;\
     
    make;\
     
    cd ..;\
    done
    toollib:
    cd $(TOOLLIB);\
    make $@
    clean:
    @
    for o in $(OBJ);\
    do\
     
    rm -f $$o;\
    done;\
    for s in $(SUBDIRS);\
    do\
     
    cd $$s;\
     
    make $@;\
     
    cd ..;\
    done
    cleanall:
    @
    for o in $(OBJ);\
    do\
     
    rm -f $$o;\
    done;\
    for s in $(SUBDIRS);\
    do\
     
    cd $$s;\
     
    make $@;\
     
    cd ..;\
    done
    rm -f $(PROG)

    CC = gcc
    FLAGS =
    OBJ = $(patsubst %.c, %.o, $(wildcard ./*.c))
    LIB = tool.a
    toollib: tool_read.o tool_write.o
    ar -rv ../$(LIB) tool_read.o tool_write.o;\
    ranlib ../$(LIB)
    tool_read.o:
    $(
    CC) $(FLAGS) -c tool_read.c
    tool_write.o:
    $(
    CC) $(FLAGS) -c tool_write.c
    clean:
    @
    for o in $(OBJ);\
    do\
     
    rm -f $$o;\
    done
    cleanall: clean
    rm -f ../$(LIB)

    CC = gcc
    FLAGS =
    OBJ = $(patsubst %.c, %.o, $(wildcard ./*.c))
    all: mod11.o mod12.o
    mod11.o:
    $(
    CC) $(FLAGS) -c mod11.c
    mod12.o:
    $(
    CC) $(FLAGS) -c mod12.c
    clean:
    @
    for o in $(OBJ);\
    do\
     
    rm -f $$o;\
    done
    cleanall: clean

3.2. Выполнение индивидуального задания

  1.  Написать скрипт на языке shell, показывающий PID процесса, который использовал на данный момент процессорное время больше других процессов.
    ps h opid k-cputime -e | grep -m1 ""
    #вывод списка
    pid без заголовка с сортировкой по времени в порядке
    #убывания
    #вывод первой строки
  2.  Написать скрипт на языке shell, выполняющий периодический поиск и уничтожение всех процессов определенной программы, которые не превысили некоторый лимит времени исполнения (имя исполняемого файла программы и лимит времени должны являться параметрами скрипта).
    #TIME TIMEOUT PROGRAM
    while true
    do
    PS=$(ps otime,pid --no-heading -C $3) #
    получаем список процессов
    echo $PS
    PTYPE=0
    KILLFLAG=0
    for PARAM in $PS
    do
    if
    test $PTYPE = 0 #
    если текущий параметрвремя
    then     #
    переводим время в секунды
    HRS=$(echo $PARAM | grep -o -e '^[0-9][0-9]')
    PARAM=$(echo $PARAM | grep -o -e '[0-9][0-9]:[0-9][0-9]$')
    MIN=$(echo $PARAM | grep -o -e '^[0-9][0-9]')
    SEC=$(echo $PARAM | grep -o -e '[0-9][0-9]$')
    HRS=$(expr $HRS '*' 3600)
    MIN=$(expr $MIN '*' 60)
    TIME=$(expr $HRS + $MIN)
    TIME=$(expr $TIME + $SEC)
    echo $TIME
    if
     test $1 -ge $TIME #
    нужно ли убивать процесс?
    then
     KILLFLAG=1
    fi
    PTYPE=1
    else  #
    если параметр – pid
    if
     test $KILLFLAG = 1 #
    нужно ли убивать?
    then
     echo "Kill $PARAM"
     kill -9 $PARAM  #
    убить
    fi
    KILLFLAG=0
    PTYPE=0
    fi
    done
    sleep $2
    done
  3.  Разработать shell скрипт, использующий sed для анализа готового файла журнала аудита.
    sort -u $1 > temp.tmp  #сортировка записей по времени + удаление
        #
    повторяющихся записей
    sed -n '/login/p' temp.tmp  #
    вывод событий типа login
    sed -n '/logout/p' temp.tmp
    sed -n '/open/p' temp.tmp
    sed -n '/read/p' temp.tmp
    sed -n '/write/p' temp.tmp
    sed -n '/exec/p' temp.tmp
    echo users count
    USERS=$(sed -n '/^[^\t]*\t[^\t]*\t\([^\t]*\).*/s//\1/p' temp.tmp | sort -u) #
    составление списка пользователей
    for u in $USERS
    do
    echo $u
    sed -n '/^[^\t]*\t[^\t]*\t\([^\t]*\).*/s//\1/p' temp.tmp | grep -c $u #
    подсчёт количества команд пользователя
    done
    echo days count
    sed -n '/^\([^\t]*\).*/s//\1/p' temp.tmp | sort -u | grep -c ""
     #
    подсчёт различных дней
    echo logout count
    sed -n '/logout/p' temp.tmp | grep -c "" #
    подсчёт событий logout
    rm -f temp.tmp
  4.  Используя редактор SED и скриптовый язык SHELL, разработать программу, которая осуществляет просмотр текущего каталога и выводит на экран его содержимое группами в порядке уменьшения числа ссылок на файлы (в том числе имена каталогов).
    ls -l | sed -n '2,$'p | sort -rk2,2
    #вывод списка файлов
    #первая строка вывода не относится к файлам, её надо убрать
    #сортировка в обратном порядке по второму полю (кол-во ссылок)

3.3. Ответы на контрольные вопросы

  1.  Чем отличаются команды вида: lsli, lsil, lsil, lsli ?
    Ничем, кроме варианта записи опций.
  2.  Каким образом можно ввести новую или удалить существующую переменную среды окружения для текущего сенса shell?
    С помощью команды
    export имяпеременной=значение или set имяпеременной=значение можно задать новую пременную, с помощью unset имяпеременной можно удалить переменную.
  3.  Для чего служат конструкции $#, $* и &&?
    $# - переменная, содержащая число параметров, переданных при запуске текущему сеансу
    shell.
    $* - переменная, эквивалентная строке вида "$1 $2 $3 ..."
    && - оператор, служащий для последовательного выполнения команд. При этом следующая команда выполняется только при завершении предыдущей команды без ошибок (код завершения равен нулю).

4. Выводы

Shell – достаточно мощный командный интерпретатор, позволяющий писать простые скрипты для выполнения определённых заданий.
Утилита
make облегчает программирование в ОС UNIX, так как при грамотно написанном makefile достаточно одной команды для построения новой версии программы.
Редактор
sed позволяет значительно расширить возможности для обработки файлов в shell-скриптах путём использования регулярных выражений и достаточно широкого выбора команд редактирования.

Приложение 

Исходные тексты программ


 

А также другие работы, которые могут Вас заинтересовать

53122. Трапеція та її властивості. Геометрія (8 клас) 365.5 KB
  Мета: Сформувати в учнів поняття трапеції її елементів розглянути означення рівнобічної та прямокутної трапеції зміст властивостей кутів трапеції прилеглих до бічної сторони та кутів та діагоналей рівнобічної трапеції. Формувати вміння: відтворювати вивчені твердження; за готовими рисунками знаходити елементи трапеції; розв’язувати найпростіші задачі на обчислення. План вивчення нового матеріалу Означення трапеції її елементи Властивості кутів трапеції прилеглих до бічних сторін; висот...
53123. Розв’язування трикутників 214.5 KB
  Мета: формувати вміння і навички розв’язування трикутника за трьома його основними елементами; повторити теореми синусів косинусів та наслідки з них; повторити основні типи задач на обчислення елементів довільних трикутників; розвивати пошукову пізнавальну активність учнів логічне мислення уяву зв’язне мовлення; виховувати самостійність наполегливість впевненість у собі інтерес до предмету. Сторону трикутника пропорційні до синусів протилежних кутів теорема синусів. Квадрат сторони трикутника дорівнює сумі...
53125. Збірник завдань для тематичної атестації з геометрії для класів з поглибленим вивченням математики. Геометрія 8 клас 1.3 MB
  Збірник є дидактичним матеріалом з геометрії для 8 класу з поглибленим вивченням математики. Він містить 8 контрольних робіт в двох варіантах, за структурою наближених до атестаційної роботи в 9 класі.
53126. ДИФФЕРЕНЦИРОВАННОЕ ОБУЧЕНИЕ НА УРОКАХ ГЕОГРАФИИ 173 KB
  Карточки-задания при изучении темы Экономические районы Украины 9 класс Карточка №1 1. Карточка №2 1. Самый высокий уровень социально-экономического развития у района: а Северо-Восточного; б Приднепровского; в Донецкого Карточка №3 1 Проведите примерную границу между областями. Каковы...
53127. Einkufe und Ernährung. Wiederholung 29.5 KB
  Wir haben schon viel an diesem Thema gearbeitet und heute veranstalten wir an der Stunde einen Wettbewerb. Ich teile die Klasse in zwei Mannschaften und ihr erfüllt im Laufe der Stunde verschiedene Aufgaben. F?r jede richtige Aufgabe bekommt ihr einen Punkt. Welche Mannschaft hat mehr Punkten (B?lle), ist der Sieger.
53128. Збірник граматичних вправ з німецької мови для 6 класу 440.5 KB
  Sie waren jung und hatten Spaß! Präsens Heute bin ich alt und habe graue Haare. Perfekt Ich bin auch mal jung gewesen und habe keine grauen Haare gehabt. Präteritum Ich war auch mal jung und hatte keine grauen Haare.
53129. Внеклассное мероприятие по немецкому языку «Рождество в Германии» 1.31 MB
  Ведущий 1: Guten Tag, liebe Freunde! Heute feiern wir der hellste Tag - Weihnachten! Heute ist der schönste Tag im ganzen Jahr. Das ist der Weihnachtstag- Wie glänzt der Christbaum hell und klar. Wie freut sich die Kinderschar.
53130. Частини тіла (5 клас) 192.5 KB
  Heute beginnen wir ein neues Thema „Der Mensch“. Wir lernen, wie alle Körperteile heißen. Zuerst hört ihr ein Gedicht und sprecht nach.