Реклама: | Скачать 50.66 Kb.
|
Содержание Код программы с комментариямиПоследнее прерывание Код программы с комментариями Функция обработки прерываний signal() |
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ) Курсовая работа по дисциплине «Операционные системы » Выполнил: Шаповалов Игорь С-44, АВТ Проверил: Преподаватель каф.МОСОиУ Истратов А.Ю. Москва 2007 г. Лабораторная работа №1 Вариант №17 Задание: Написать программу, определяющую права доступа для всех файлов текущего каталога. Передать эту информацию через файловую систему в параллельный процесс и вывести данные только о тех файлах, дата создания которых не превышает семи дней от текущей даты. Предусмотреть возможность прерывания от клавиатуры. ^ #include #include #include #include int i=0; /* Счетчик прерываний */ sig() /* Функция обработки прерываний */ { i++; if(i==3) { printf("ПОСЛЕДНЕЕ ПРЕРЫВАНИЕ \nВЫХОД\n"); exit(0); } else { printf("П Р Е Р Ы В А Н И Е %d \n",i); sleep(1); } } main() { void sig(); /* Объявляем функцию обработки прерывании*/ signal(SIGINT, sig); /* В случае прихода сигнала прерываний SIGINT управление передается функции sig */ if(fork()==0) /* Распараллеливание процесса */ { /* Процесс сын */ system("ls -l | awk '{print $1 $9}' > 1.txt "); /*Выводим информацию о всех файлах данного каталога, вырезаем столбцы с правами доступа и именами файлов и записываем в 1.txt*/ system("cut -b 2-100 1.txt > 2.txt"); /*Вырезаем символы в 1.txt, начиная со второго, и записываем в 2.txt*/ system("rm 1.txt"); /*Удаляем 1.txt*/ } else { /* Процесс отец */ wait(1); /*Ждёт завершения Сына*/ system("find -mtime -7 > 3.txt"); /*Отсеиваем файлы, дата модификации которых не превышает семи дней, и их имена записываем в 3.txt*/ system("cut -b 3-100 3.txt > 1.txt"); /* Вырезаем символы в 3.txt, начиная с третьего, и записываем в 1.txt */ system("rm 3.txt"); /*Удаляем 3.txt*/ char b[100]; /*Создание массива из 100 элементов*/ FILE *da; da = fopen ("1.txt" , "r"); /*Открываем 1.txt на чтение*/ sleep(2); while(1) { if(fscanf (da, "%s", b)==EOF){ break; } /* Считываем построчно информацию в массив b*/ else { char n[100]=""; strcat(n, "grep "); /*Записываем в массив n grep*/ strcat(n, b); /*Записываем в массив n название из b*/ strcat(n, " 2.txt"); /*Записываем в массив n 2.txt*/ system(n); /*Выполняем команду, получившуюся в n*/ } } fclose (da); } } Пояснение:
Программа разделяется на две идентичные копии, которые продолжают выполняться как два независимых процесса. fork()==0 – процесс –сын. fork()==1 – процесс – отец. Функция обработки прерываний sig():
ВЫХОД и выходим из программы
П Р Е Р Ы В А Н И Е Лабораторная работа №2 Задание: Выполнить лабораторную работу №1 на интерпретаторе команд shell. ^ count=0 #Счётчик прерываний signal() #Функция обработки прерываний { count=`expr $count + 1` if [ $count -eq 3 ] then echo "ПОСЛЕДНЕЕ ПРЕРЫВАНИЕ" echo "ВЫХОД" exit 0; else echo "ПРЕРЫВАНИЕ $count" fi } trap signal 2 #В случае прихода сигнала прерывании, управление передается ф-ии signal sleep 1 sleep 1 sleep 1 ls -l | awk '{print $1 $9}' > 1.txt #Выводим информацию о всех файлах данного каталога, вырезаем столбцы с правами доступа и именами файлов и записываем в 1.txt cut -b 2-100 1.txt > 2.txt #Вырезаем символы в 1.txt, начиная со второго, и записываем в 2.txt rm 1.txt #Удаляем 1.txt find -mtime -7 > 3.txt #Отсеиваем файлы, дата модификации которых не превышает семи дней, и их имена записываем в 3.txt cut -b 3-100 3.txt > 1.txt #Вырезаем символы в 3.txt, начиная с третьего, и записываем в 1.txt rm 3.txt #Удаляем 3.txt b=`cat 1.txt` #Создаём переменную b, в которой лежит информация из 1.txt for i in $b do grep $i 2.txt #По шаблону сравниваем i-тый элемент переменной b с информацией в 2.txt done sleep 1 sleep 1 sleep 1 Пояснение:
trap signal 2 - в случае прихода сигнала прерывании (2 –SIGINT) управление передается функции signal.
ls -l | awk '{print $1 $9}' Команда ls - l выдает информацию о всех файлах данного каталога. Результат выполнения этой команды поступает на вход команды awk '{print$1 $9}'. Команда awk '{print$1 $9}' – выводит на экран только первый и девятый столбцы из полученной информации. ^
expr –команда, осуществляющая вычисление арифметических выражений, выполняет следующие действия: + , - , * , / , % (остаток от деления). expr $count + 1 – означает, что берем значение переменной count и увеличиваем на 1. `…` - присвоить результат выполнения команды. Т.е. получается: присвоить переменной count результат выполнения команды: увеличить значение переменной count на 1.
ПОСЛЕДНИЕ ПРЕРЫВАНИЕ ВЫХОД и выходим из программы.
П Р Е Р Ы В А Н И Е
- eq( = ) - le ( <= ) -qt ( > ) - lt (< ) - ge ( >= ) -ne ( != ) |