Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Средства взаимодействия между процессами




 

В ОС Linux имеются разнообразные средства межпроцессного взаимодействия. Из UNIX System V заимствован механизм IPC (interprocess communication), который включает в себя три вида коммуникаций: сообщения (messages), разделение памяти (shared memory) и семафоры (semaphores). Обмен сообщениями позволяет одним процессам передавать данные другим процессам. Разделение памяти даёт возможность процессам совместно использовать определённые области виртуального адресного пространства. Семафоры обеспечивают синхронизацию процессов. Помимо этого имеется механизм сигналов (signals) и каналов (pipes), рассмотре нием которых мы ограничимся.


На уровне интерактивного взаимодействия с системой чаще всего приходится пользоваться сигналами и каналами. Сигнал сообщает процессу о наступлении асинхронного события. Как это не покажется странным, для посылки сигнала используется команда kill (дословно – убить). Действительно, на практике сигналы чаще всего используются для принудительного завершения какого-либо процесса, вышедшего из-под контроля. Получить перечень возможных сигналов позволяет команда kill –l, по которой выведится список из 62 сигналов. Некоторые сигналы вызывают конкретные действия, а иные зарезервированы. В качестве опции команды kill можно указывать как символьное, так и числовое значение сигнала.

Большинство сигналов адресуются непосредственно к программе, и для их обработки программисту необходимо написать соответствующую процедуру. Для исследования процессов при выполнении лабораторных работ М.Э. Пономаревым написана небольшая программа с именем signignore, которая позволяет игнорировать все сигналы, за исключением самого главного. Сигнал kill -9 PID адресуется не процессу, а планировщику задач, поэтому «непослушный» процесс не сможет такой сигнал перехватить и игнорировать.

Пользователь может послать сигнал только тем процессам, которые сам запустил. Администратор имеет право прекратить исполнение любого процесса. Для «убийства» всех процессов, созданных одной программой, также требуются полномочия суперпользователя, для чего он должен воспользоваться командой kill (см. руководство man или info).

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

2.8. Перенаправление ввода/вывода

 

Все программы в UNIX/Linux запускаются с тремя открытыми файлами: стандартным вводом (stdin), стандартным выводом (stdout) и стандартным выводом сообщений об ошибках (stderr). В оболочке bash поддерживается возможность перенаправления информации в командной строке посредством использования символов «<» для перенаправления стандартного ввода и «>» для стандартного вывода. По умолчанию стандартный ввод и стандартный вывод ассоциированы с консолью (ввод с клавиатуры, вывод на монитор). Но часто возникает необходимость выводить информацию не на экран (пользователя в это время у компьютера может не оказаться либо объем выводимой информации может оказаться слишком

 

большим для ее чтения с экрана), а в файл, который можно прочитать или распечатать потом.

Перенаправить данные можно различными способами. Например, команда

ls –la /home/user1 > /root/user1.ls

записывает список файлов пользователя в текстовый файл. Если этот файл не существует, то он создается. Если он существует, то он перезаписывается, т. е. его прежнее содержимое стирается.

 

echo ”Содержимое каталога /home/user1” >> /root/user1.ls

в этом случае выводимая информация дописывается к содержимому файла. Если файл не существует, при первом исполнении команды он будет создан.

Иногда вывод информации необходимо перенаправить в какое-либо устройство. В этом случае мы адресуемся к специальному файлу устройства, который является посредником между командным интерпретатором и драйверами устройства. Например, читаем ранее созданный образ дискеты и копируем его на сменный носитель:

cat image_fd > /dev/fd0

Выводим содержимое файла на принтер, подключенный к первому параллельному порту:

cat file1.txt > /dev/lp0

Воспроизводим звуковой файл через звуковой адаптер:

cat /usr/share/sndconfig/sample.au > /dev/audio

Аналогично можно изменить стандартный ввод информации, которым по умолчанию является клавиатура. С помощью перенаправления ввода можно записывать в файл сигналы с устройства, подключенного к последовательному интерфейсу. Комбинируя команды перенаправления ввода и вывода, можно передавать данные программе из одного файла и выводить результаты в другой файл. Так, например, утилита iconv позволяет изменить кодировку символов в файле, для чего целевой файл следует указать с операциями перенаправления вывода:

iconv -f utf-8 -t cp1251 < in_file_utf > out_file_win

iconv -f cp1251 -t utf-8 < in_file_win > out_file_utf

iconv -f koi8-r -t cp1251 < in_file_koi > out_file_win

iconv -f cp1251 -t koi8-r < in_file_win > out_file_koi

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

Более простыми и распространенными являются неименованные каналы. В языке командных интерпретаторов неименованный канал обозначается символом «. В некоторых источниках он именуется конвейером и служит средством группирования команд с передачей информации между стандартным выводом одной команды и стандартным вводом следующей за ней. Одним из простейших примеров использования неименованных каналов является постраничный просмотр на экране большого списка файлов, формируемый соответствующей командой. Так, чтобы последовательно просмотреть листинг файлов каталога большого объема, используют сочетание команд:

ls –la /bin|more

Вторая команда more как раз и обеспечивает поэкранный вывод данных с возможностью «листать» страницы вперед при нажатии любой клавиши. Комбинированная команда

ls –la /bin|less

позволяет постранично «листать» файл в обе стороны. Правда, при работе в графическом режиме и эмуляции текстового терминала в окне просматривать файл можно и без дополнительных команд, используя для этого боковые полосы прокрутки.

Приведем еще несколько примеров использования неименованных каналов. Утилита cat читает текстовый файл file_name и передает последовательный поток символов программе wc, которая подсчитывает число строк, слов и символов в файле:

cat <file_name>|wc

Впрочем, команда

wc <file_name>

делает то же самое, но пишется короче.

Утилита ps выводит таблицу процессов, а утилита head отображает первые 20 строк этой таблицы:

ps –ef | head -20

Утилита dd читает содержимое оптического диска, установленного в привод /dev/hdc, а grep ищет в считываемых данных строку «Linux»:

dd if=/dev/hdc | grep “Linux”

В следующем примере уже упомянутая утилита dd считывает из логического раздела на жестком диске второй 4-килобайтный блок данных, находит в нем описатель 5-й группы блоков и выводит его шестнадцатеричный и символьный дамп на экран:

dd if=/dev/hda7 bs=4096 skip=1 count=1 | dd bs=32 skip=4 count=1 | xxd

Утилиты ps и top отображают каждый процесс, участвующий в конвейере, отдельной строкой.

Как уже указывалось, емкость канала ограничена размером буфера памяти, и если передающий процесс записывает в него данные быстрее, чем принимающий читает их, то он приостанавливается до тех пор, пока читающий процесс не освободит канал, и наоборот, если в канале ничего нет, то читающий процесс приостанавливается до появления информации в канале. Таким образом происходит синхронизация передачи по каналу.

Именованные каналы в UNIX системах представлены в виде специальных файлов, по своей сути подобных файлам устройств с последовательным доступом. За именованными каналами закрепилось еще одно название – файлы FIFO (First-In, First-Out – первым вошел, первым обслужен). К таким каналам может обратиться любой процесс. В консольном режиме именованные каналы создаются командой mkfifo, например:

mkfifo /tmp/fifo1

Каталог /tmp как директория с равным и полным доступом очень удобен для создания файлов, к которым будут обращаться многие. К созданному именованному каналу можно обращаться как к обычному файлу. Для того чтобы убедиться в этом, следует войти в систему из двух текстовых консолей. Затем в командной строке первой консоли ввести команду чтения из созданного именованного канала:

cat < /tmp/fifo1,

а во второй консоли – команду перенаправления вывода в канал:

cat > /tmp/fifo1

После этого во второй консоли можно ввести произвольную строку, завершить буферизированный ввод нажатием клавиши <Enter> и, перейдя в первую консоль, прочитать введенную строку на экране. Удаляется именованный канал так же, как обычный файл.

Емкость именованного канала в системах Linux составляет 4 Кб. Внутри канала имеется буфер, способный воспринимать ввод, даже если из канала никто не читает.

 

2.9. Файловая система /proc как «зеркало» процессов

 

В ОС Linux присутствует виртуальная файловая система, монтируемая при загрузке к каталогу /proc ( от слова process ). В отличие от других файловых систем, размещаемых на внешних машинных носителях, эта файловая система располагается в оперативной памяти, обеспечивает связь с ядром и предназначена для предоставления текущей информации о компьютерной системе (состояние ядра, процессы, параметры компьютера и т. д.), чем представляет большой интерес, в том числе с позиций компьютерной безопасности. Многие из утилит, выводящие информацию о системе (например, ранее рассмотренные команды ps и top), берут исходные данные именно из каталога /proc.

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

Объект /proc включает в себя файлы и каталоги с числовыми и символьными именами. Каталоги с числовыми именами содержат информацию о каждом выполняющемся процессе, а само имя каталога образовано от идентификатора выполняемого процесса (PID). При создании процесса соответствующий каталог появляется, а при уничтожении процесса – исчезает. В каждом из таких «числовых» каталогов содержатся одни и те же файловые объекты (табл. 2.1).

Если в процессе выполнения сам исполняемый файл оказался удаленным, ссылка exe позволит восстановить удаленный файл, скопировав его образ из оперативной памяти [7].

В подкаталоге fd (fd – file descriptor) можно получить оперативную информацию обо всех файлах, которые были открыты данным процессом. Именно отсюда берет информацию команда lsof, часто используемая для наблюдения за открытыми файлами.

Виртуальный файл cmdline содержит полные параметры командной строки, использованные при запуске программы. Отсюда информация переписывается в файл истории команд.

 

 

Таблица 2.1

Имя файла в подкаталоге /proc/PID Содержимое файла
cmdline Список аргументов командной строки процесса (параметры, передаваемые программе). Список представлен одной последовательностью, в которой аргументы отделяются друг от друга байтами вида «0x00»
cwd Символическая ссылка на каталог, который установлен текущим (рабочим) для процесса (cwd – change working directory)
environ Переменные окружения (USER, HOME, PATH и др.). Элементы списка разделяются друг от друга байтами вида «0x00»
exe Ссылка на исполняемый файл процесса
fd Каталог, содержащий символические ссылки на файлы, открытые данным процессом
maps Карта распределения адресного пространства процесса в виде форматированного текстового файла
mem Память процесса
root Ссылка на корневой каталог процесса (обычно /)
stat Состояние процесса на момент просмотра
statm Состояние памяти процесса. Содержит список из 7 чисел, разделенных пробелами. Эти числа: · общий размер процесса в мегабайтах · размер резидентной части процесса · размер совместно используемой памяти · размер сегмента кода · размер загруженных библиотек · объем памяти стека · число модифицированных страниц памяти
status Состояние процесса в виде, предназначенном для пользователя. Файл содержит идентификатор процесса, родительского процесса, реальный и эффективный идентификаторы пользователя, статистику использования памяти и битовые маски, указывающие, какие сигналы процессом перехватываются, игнорируются или блокируются

 

О назначении файлов и каталогов с символьными именами можно догадаться по этим именам. Например, сведения о последовательных пор-

 

тах содержатся в файле /proc/tty/driver/serial. Обращение к этим файловым объектам позволяет получить текущую информацию об аппаратной платформе и драйверах устройств, а также много иной интересной информации.

Виртуальный текстовый файл /proc/mounts содержит информацию об уже смонтированных файловых системах. Почти такая же, но более подробная информация записывается в реальный файл /etc/mtab.

Если имеются сомнения в том, что утилита ps правильно отображает все процессы, можно обратиться к каталогу /proc. Достаточно ввести друг за другом две команды:

ls -d /proc/*|grep [0-9]|wc -l

и

ps ax|wc -l

и сравнить результаты. Первый программный конвейер считает имена нумерованных каталогов в каталоге /proc, а второй суммирует процессы, отображаемые утилитой ps. Результаты не должны сильно отличаться. Это поможет в случае подмены злоумышленником утилиты ps.




Поделиться с друзьями:


Дата добавления: 2015-03-31; Просмотров: 732; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.029 сек.