ISSN 2305-5626. Вестник МГТУ им. Н.Э. Баумана: электронное издание. 2013
13
ется специальным видом файлового дескриптора [3] и поэтому также
представляется объектом этой структуры.
Рис. 12. Расширение структуры
task_struct
Для одного и того же сокета объект типа
file
в разных процессах
может быть различным. Поэтому его нельзя использовать для выяв-
ления совместного чтения несколькими процессами из клиентского
сокета: у каждого из них этот дескриптор может быть своим. Уни-
кальным объектом, соответствующим сокету, является структура ин-
дексного дескриптора
inode
(файл
fs.h
). Ее также следует расши-
рить необходимыми полями, указанными на рис. 5. Поскольку эти
данные могут использоваться различными процессами, то их следует
защитить с помощью средства синхронизации. Для этого в структуру
inode добавляется спин-блокировка, которая позволит обеспечивать
монопольный доступ к полям объекта.
В разработанном методе используются системные вызовы для
определения ошибок, поэтому требуется найти, какие функции реа-
лизуют интересующие системные вызовы. Такие системные вызовы
мультиплексирования, как
select( )
,
pselect( )
,
poll( )
, реали-
зуются в файле
select.c
. Целесообразно встроить соответствующий
код, реализующий показанные на рис. 6 и 7 алгоритмы, в то место,
где системная функция выполняет обход по переданным сокетам.
Это делают в функции
do_select( )
. Кроме того, ее же используют
в системном вызове
pselect( )
. В случае
poll( )
необходимая для
встраивания кода функция носит название
do_poll( )
.
Процесс может использовать различные системные вызовы чте-
ния (
read( )
,
recv( )
и др.) и записи в сокет (
write( )
,
send( )
и
др.). Для их перехвата находят ту функцию ядра, которую вызовут
все функции чтения или записи. Для чтения такой функцией является
sock_recvmsg( )
, а для записи —
sock_sendmsg( )
. Кроме того,
необходимо перехватывать системный вызов
accept( )
. Он опреде-
лен в файле
af_inet.c
, и функция носит название
inet_accept( )
.
Отслеживать состояния блокирования можно с помощью кода,
добавленного в системный планировщик задач: когда задача блоки-
руется для сна, вызывается планировщик, который выбирает новую
задачу для выполнения.
1...,3,4,5,6,7,8,9,10,11,12 14,15