Операционная система UNIX. Руководство программиста

       

ОЧЕРЕДИ СООБЩЕНИЙ


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

  • Послать сообщение.
  • Принять сообщение.

Процесс, прежде чем послать или принять какое-либо сообщение, должен попросить систему породить необходимые для обработки данных операций программные механизмы. Процесс делает это при помощи системного вызова msgget(2). Обратившись к нему, процесс становится владельцем/создателем некоторого средства обмена сообщениями; кроме того, процесс специфицирует первоначальные права на выполнение операций для всех процессов, включая себя. Впоследствии владелец/создатель может уступить право собственности или изменить права на операции при помощи системного вызова msgct(2), однако на протяжении всего времени существования средства обмена сообщениями создатель остается создателем. Другие процессы, обладающие соответствующими правами, для выполнения различных управляющих действий также могут использовать системный вызов msgct(2).

Процессы, имеющие права на операции и пытающиеся послать или принять сообщение, могут приостанавливаться, если выполнение операции не было успешным. В частности это означает, что процесс, пытающийся послать сообщение, может ожидать, пока процесс-получатель не будет готов; наоборот, получатель может ждать отправителя. Если указано, что процесс в таких ситуациях должен приостанавливаться, говорят о выполнении над сообщением "операции с блокировкой". Если приостанавливать процесс нельзя, говорят, что над сообщением выполняется "операция без блокировки".

Процесс, выполняющий операцию с блокировкой, может быть приостановлен до тех пор, пока не будет удовлетворено одно из условий:

  • Операция завершилась успешно.
  • Процесс получил сигнал.
  • Очередь сообщений ликвидирована.

Системные вызовы позволяют процессам пользоваться этими возможностями обмена сообщениями. Вызывающий процесс передает системному вызову аргументы, а системный вызов выполняет (успешно или нет) свою функцию. Если системный вызов завершается успешно, он выполняет то, что от него требуется, и возвращает некоторую содержательную информацию. В противном случае процессу возвращается значение -1, известное как признак ошибки, а внешней переменной errno присваивается код ошибки.



Содержание раздела