Реклама: | Скачать 59.89 Kb.
|
Содержание II. Функция обработки прерываний sig().Последнее прерывание Лабораторная работа №2 |
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ) Курсовая работа по дисциплине «Операционные системы » Выполнил: Грязьнев Фёдор С-44, АВТ Проверил: Преподаватель каф.МОСОиУ Истратов А.Ю. Москва 2007 г. Лабораторная работа №1 Вариант №6 Задание: Написать программу выдачи списка всех пользователей, работающих в настоящее время в системе (имена связанных с ними терминалов и время входа в систему не указывать). Передать полученную информацию через межпроцессный канал в параллельный процесс, где вывести на экран. Предусмотреть возможность неоднократного внешнего прерывания. При каждом прерывании вывести время его поступления. Пояснение: I. Основная функция main()
Это массив из двух элементов, первый элемент которого g[0] - дескрипторы межпроцессного канала на чтение из канала, второй -g[1] - дескрипторы межпроцессного канала на запись в канал.
Программа разделяется на две идентичные копии, которые продолжают выполняться как два независимых процесса. fork()==0 – процесс –сын. fork()==1 – процесс – отец.
1 /dev/tty - файл на стандартный вывод. 2 /dev/tty - файл на стандартное выполнение. Строка: close(1) означает закрытие стандартного вывода.
dup2(g[1],1) - дублирование дескриптора межпроцессного канала на стандартный вывод. После этого все данные будут выводиться не на экран (по умолчанию), а в межпроцессный канал.
execl("/usr/bin/users","users",0) - вывод всех пользователей, работающих в данный момент в системе.
^
^ Goodbye время его поступления и выходим из программы 3. Если число прерываний меньше трех, выводим на экран сообщение: П Р Е Р Ы В А Н И Е И время его поступления - printf(__TIME__ "\n") #include #include int i=0; /* Счетчик прерываний */ void sig() /* Функция обработки прерываний */ { i++; if(i==3) { printf("ПОСЛЕДНЕЕ ПРЕРЫВАНИЕ \n goodbye\n"); printf(__TIME__ "\n"); exit(0); } else { printf("П Р Е Р Ы В А Н И Е %d \n ",i); printf(__TIME__ "\n"); sleep(2); } } main() { void sig(); /* Объявляем функцию обработки прерывании*/ int g[2]; /*Объявляем дескрипторы межпроцессного канала */ char buf[800]; /*Объявляем массив из 800 элементов*/ signal(SIGINT, sig); /* В случае прихода сигнала прерываний SIGINT управление передается функции sig */ pipe(g); /* Создание межпроцессного канала*/ if (fork()==0) /* Распараллеливание процесса */ { /* Процесс сын */ close(1); /* Закрытие стандартного вывода */ close(g[0]); /* Закрытие межпроцессного канала на чтение */ dup2(g[1],1); /* дублирование дескриптора межпроцессного канала на стандартный вывод */ close(g[1]); /* Удаляем копию*/ execl("/usr/bin/users","users",0); /* Вывод всех пользователей, работающих в данный момент в системе */ } else { /* Процесс отец */ close(g[1]); /* Закрытие межпроцессного канала на запись */ dup2(g[0],0); /* дублирование дескриптора межпроцессного канала на стандартный ввод */ while(1) { if(scanf("%s",buf)==EOF) /* Считывание построчно из межпроцессного канала информацию в массив buf */ break; printf("%s\n",buf); /* Вывод на экран значение переменной buf*/ } sleep(2); } } ^ Вариант №6 Задание: Выполнить лабораторную работу №1 на интерпретаторе команд shell. Описание:
expr –команда, осуществляющая вычисление арифметических выражений, выполняет следующие действия: + , - , * , / , % (остаток от деления). expr $numsig + 1 –означает, что берем значение переменной numsig ($) и увеличиваем на 1. `…` - присвоить результат выполнения команды. Т.е. получается: присвоить переменной numsig результат выполнения команды: увеличить значение переменной numsig на 1.
Команда test осуществляет проверку файлов, числовых величин и цепочек символов. Выражение: if test $numsig -eq 3 then Означает: если значение переменной numsig равно трем (-eq 3), то …. - eq ( = ) - le ( <= ) -qt ( > ) - lt (< ) - ge ( >= ) -ne ( != )
trap signal 2 - в случае прихода сигнала прерывании (2 –SIGINT) управление передается функции signal.
who | awk '{print$1}' Команда who выдает список всех пользователей, работающих в настоящее время в системе. Результат выполнения этой команды поступает на вход команды awk '{print$1}'. Команда awk '{print$1}' – выводит на экран только первый столбец из полученной информации. Листинг: numsig=0; #счетчик прерывании signal() #Функция обработки прерывании { numsig=`expr $numsig + 1`; if test $numsig -eq 3 then echo "Последнее Прерывание" date | awk '{print$4}' exit 0; else echo "прерывание" date | awk '{print$4}' sleep 2; fi } trap signal 2 #В случае прихода сигнала прерывании, управление передается ф-ии signal sleep 1; who | awk '{print$1}' sleep 1; sleep 1; sleep 1; |