Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ

ЭЛЕКТРОНИКИ И МАТЕМАТИКИ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

Курсовая работа по дисциплине

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

Выполнил:

Грязьнев Фёдор

С-44, АВТ

Проверил:

Преподаватель каф. МОСОиУ

Москва

2007 г.

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

Вариант №6

Задание:

Написать программу выдачи списка всех пользователей, работающих в настоящее время в системе (имена связанных с ними терминалов и время входа в систему не указывать). Передать полученную информацию через межпроцессный канал в параллельный процесс, где вывести на экран. Предусмотреть возможность неоднократного внешнего прерывания. При каждом прерывании вывести время его поступления.

Пояснение:

I. Основная функция main()

1.  Объявляем функцию обработки прерывании sig().

2.  Объявляем дескрипторы межпроцессного канала g[2].

Это массив из двух элементов, первый элемент которого g[0] - дескрипторы межпроцессного канала на чтение из канала, второй - g[1] - дескрипторы межпроцессного канала на запись в канал.

3.  Объявляем массив из 800 элементов buf[800], в который в дальнейшем будем считывать информацию из межпроцессного канала.

4.  Системный вызов signal(SIGINT, sig) означает, что в случае прихода сигнала прерываний SIGINT , управление передается функции sig()

5.  pipe(g) - Создание межпроцессного канала - коммуникационный канал между двумя взаимосвязанными процессами.

6.  Для распараллеливания процессов используем системный вызов fork().

НЕ нашли? Не то? Что вы ищете?

Программа разделяется на две идентичные копии, которые продолжают выполняться как два независимых процесса.

fork()==0 – процесс –сын.

fork()==1 – процесс – отец.

7.  Процесс - сын:

7.1.  При создании программы автоматически создаются три файла – пользовательские дескрипторы файлов:

0  /dev/tty - файл на стандартный ввод.

1 /dev/tty - файл на стандартный вывод.

2 /dev/tty - файл на стандартное выполнение.

Строка: close(1) означает закрытие стандартного вывода.

7.2.  close(g[0]) - закрытие межпроцессного канала на чтение.

7.3.  Системный вызов dup2 позволяет осуществить доступ к одному и тому же файлу из одного и того же пользовательского процесса через два различных пользовательских дескриптора файла.

dup2(g[1],1) - дублирование дескриптора межпроцессного канала на стандартный вывод.

После этого все данные будут выводиться не на экран (по умолчанию), а в межпроцессный канал.

7.4.  close(g[1]) – удаляем копию.

7.5.  Системный вызов execl осуществляет вызов новой команды вместо уже выполняющейся без возврата в вызывающую программу.

execl("/usr/bin/users","users",0) - вывод всех пользователей, работающих в данный момент в системе.

8.  Процесс – отец:

8.1  close(g[1]) - закрытие межпроцессного канала на запись.

8.2  dup2(g[0],0) - дублирование дескриптора межпроцессного канала на стандартный ввод.

8.3  Следующим действием, в бесконечном цикле, считываем построчно из межпроцессного канала информацию в массив buf и выводим на экран его значение.

II. Функция обработки прерываний sig().

1.  При каждом заходе в функцию увеличиваем счетчик прерываний на 1.

2.  Если число прерываний достигло трех, выводим на экран сообщение:

ПОСЛЕДНЕЕ ПРЕРЫВАНИЕ

Goodbye

время его поступления и выходим из программы

3. Если число прерываний меньше трех, выводим на экран сообщение:

П Р Е Р Ы В А Н И Е

И время его поступления - printf(__TIME__ "\n")

#include <stdio. h> /* Включаем заголовочные файлы*/

#include <signal. h> /* Включаем заголовочные файлы*/

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);

}

}

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

Вариант №6

Задание:

Выполнить лабораторную работу №1 на интерпретаторе команд shell.

Описание:

1.  Объявляем переменную numsig=0; -счетчик прерываний.

2.  Функция обработки прерываний signal().

2.1  numsig=`expr $numsig + 1`; - увеличиваем значение счетчика на 1.

expr –команда, осуществляющая вычисление арифметических выражений, выполняет следующие действия: + , - , * , / , % (остаток от деления).

expr $numsig + 1 –означает, что берем значение переменной numsig ($) и увеличиваем на 1.

`…` - присвоить результат выполнения команды.

Т. е. получается: присвоить переменной numsig результат выполнения команды: увеличить значение переменной numsig на 1.

2.2  Если число прерываний достигло трех (счетчик прерываний = 3), выводим на экран сообщение: Последнее Прерывание, время его прихода и выходим из программы.

Команда test осуществляет проверку файлов, числовых величин и цепочек символов.

Выражение: if test $numsig - eq 3 then

Означает: если значение переменной numsig равно трем (-eq 3), то ….

- eq ( = ) - le ( <= ) - qt ( > )

- lt (< ) - ge ( >= ) - ne ( != )

2.3  Если число прерываний меньше трех, выводим на экран сообщение: прерывание и время его поступления.

3.  Основная функция

3.1  Команда trap означает, что при получении сигнала запускается программа обработчик сигналов.

trap signal 2 - в случае прихода сигнала прерывании (2 –SIGINT) управление передается функции signal.

3.2Интерпретатор shell допускает объединение нескольких команд в конвейер (образуется с помощью операции "|") для их совместного выполнения. В этом случае информационная связь осуществляется через межпроцессный канал, и результат выполнения одной команды сразу поступает на вход другой.

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;