Difference between revisions of "SysFn60/ru"

From KolibriOS wiki
Jump to navigation Jump to search
m
m
 
Line 1: Line 1:
'''Функция 60 - Inter Process Communication (IPC).'''
+
'''Функция 60''' - Inter Process Communication (IPC).
  
 
IPC применяется для посылок сообщений от одного процесса/потока
 
IPC применяется для посылок сообщений от одного процесса/потока
Line 10: Line 10:
 
''Параметры:''
 
''Параметры:''
  
* eax = 60 - номер функции
+
:* eax = 60 - номер функции
* ebx = 1 - номер подфункции
+
:* ebx = 1 - номер подфункции
* ecx = указатель на буфер
+
:* ecx = указатель на буфер
* edx = размер буфера
+
:* edx = размер буфера
  
 
''Возвращаемое значение:''
 
''Возвращаемое значение:''
  
* eax = 0 - всегда успешно
+
:* eax = 0 - всегда успешно
  
 
''Формат IPC-буфера:''
 
''Формат IPC-буфера:''
  
* +0: dword: если здесь не 0, то буфер считается заблокированным; блокируйте/разблокируйте буфер, когда вы с ним активно работаете и вам надо, чтобы извне не изменялись данные буфера (не поступали новые сообщения)
+
:* +0: dword: если здесь не 0, то буфер считается заблокированным; блокируйте/разблокируйте буфер, когда вы с ним активно работаете и вам надо, чтобы извне не изменялись данные буфера (не поступали новые сообщения)
* +4: dword: занято места в буфере (в байтах)
+
:* +4: dword: занято места в буфере (в байтах)
* +8: первое сообщение
+
:* +8: первое сообщение
* +8+n: второе сообщение
+
:* +8+n: второе сообщение
* ...
+
:* ...
  
 
''Формат сообщения:''
 
''Формат сообщения:''
  
* +0: dword: PID процесса/потока, пославшего сообщение
+
:* +0: dword: PID процесса/потока, пославшего сообщение
* +4: dword: длина сообщения (не считая этот заголовок)
+
:* +4: dword: длина сообщения (не считая этот заголовок)
* +8: n*byte: данные сообщения
+
:* +8: n*byte: данные сообщения
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_IPC (60)
 +
::ebx - SSF_SET_AREA (1)
  
 
=== Подфункция 2 - послать сообщение IPC. ===
 
=== Подфункция 2 - послать сообщение IPC. ===
Line 39: Line 43:
 
''Параметры:''
 
''Параметры:''
  
* eax = 60 - номер функции
+
:* eax = 60 - номер функции
* ebx = 2 - номер подфункции
+
:* ebx = 2 - номер подфункции
* ecx = PID приёмника
+
:* ecx = PID приёмника
* edx = указатель на данные сообщения
+
:* edx = указатель на данные сообщения
* esi = длина сообщения (в байтах)
+
:* esi = длина сообщения (в байтах)
  
 
''Возвращаемое значение:''
 
''Возвращаемое значение:''
  
* eax = 0 - успешно
+
:* eax = 0 - успешно
* eax = 1 - приёмник не определил буфер для IPC-сообщений (может быть, ещё не успел, а может быть, это не тот поток, который нужен)
+
:* eax = 1 - приёмник не определил буфер для IPC-сообщений (может быть, ещё не успел, а может быть, это не тот поток, который нужен)
* eax = 2 - приёмник заблокировал IPC-буфер; попробуйте немного подождать
+
:* eax = 2 - приёмник заблокировал IPC-буфер; попробуйте немного подождать
* eax = 3 - переполнение IPC-буфера приёмника
+
:* eax = 3 - переполнение IPC-буфера приёмника
* eax = 4 - процесса/потока с таким PID не существует
+
:* eax = 4 - процесса/потока с таким PID не существует
 
''Замечания:''
 
''Замечания:''
  
* Система сразу после записи IPC-сообщения в буфер посылает потоку-приёмнику событие с кодом 7 (см. [[Events/ru | коды событий]]).
+
:* Система сразу после записи IPC-сообщения в буфер посылает потоку-приёмнику событие с кодом 7 (см. [[Events/ru | коды событий]]).
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_IPC (60)
 +
::ebx - SSF_SEND_MESSAGE (2)
  
 
{{System_functions}}
 
{{System_functions}}
 
[[Category: SysCalls]]
 
[[Category: SysCalls]]

Latest revision as of 12:37, 18 January 2016

Функция 60 - Inter Process Communication (IPC).

IPC применяется для посылок сообщений от одного процесса/потока другому. При этом следует предварительно договориться о том, как интерпретировать конкретное сообщение.

Подфункция 1 - установить область для получения IPC

Вызывается процессом-приёмником.

Параметры:

  • eax = 60 - номер функции
  • ebx = 1 - номер подфункции
  • ecx = указатель на буфер
  • edx = размер буфера

Возвращаемое значение:

  • eax = 0 - всегда успешно

Формат IPC-буфера:

  • +0: dword: если здесь не 0, то буфер считается заблокированным; блокируйте/разблокируйте буфер, когда вы с ним активно работаете и вам надо, чтобы извне не изменялись данные буфера (не поступали новые сообщения)
  • +4: dword: занято места в буфере (в байтах)
  • +8: первое сообщение
  • +8+n: второе сообщение
  • ...

Формат сообщения:

  • +0: dword: PID процесса/потока, пославшего сообщение
  • +4: dword: длина сообщения (не считая этот заголовок)
  • +8: n*byte: данные сообщения

Константы для регистров:

eax - SF_IPC (60)
ebx - SSF_SET_AREA (1)

Подфункция 2 - послать сообщение IPC.

Вызывается процессом-инициатором.

Параметры:

  • eax = 60 - номер функции
  • ebx = 2 - номер подфункции
  • ecx = PID приёмника
  • edx = указатель на данные сообщения
  • esi = длина сообщения (в байтах)

Возвращаемое значение:

  • eax = 0 - успешно
  • eax = 1 - приёмник не определил буфер для IPC-сообщений (может быть, ещё не успел, а может быть, это не тот поток, который нужен)
  • eax = 2 - приёмник заблокировал IPC-буфер; попробуйте немного подождать
  • eax = 3 - переполнение IPC-буфера приёмника
  • eax = 4 - процесса/потока с таким PID не существует

Замечания:

  • Система сразу после записи IPC-сообщения в буфер посылает потоку-приёмнику событие с кодом 7 (см. коды событий).

Константы для регистров:

eax - SF_IPC (60)
ebx - SSF_SEND_MESSAGE (2)