===== hunt =====
==== Синтаксис ====
OSBOOLEAN hunt(const char *name,
OSUSER user,
PROCESS *name_,
union SIGNAL **hunt_sig);
==== Описание ====
Ищет процесс по имени и обновляет параметр name_ идентификатором найденного процесса.\\
Параметр name_ может быть установлен в NULL, если значение получать не требуется. Это может быть удобно, когда присутствует hunt_sig.\\
Ищутся только процессы с заданным номером пользователя. Если параметр user установлен в ноль, ищется процесс с номером пользователя вызывающего процесса, а не superuser.\\
(Пропущен порядок поиска)\\
Если процесс найден немедленно, идентификатор найденного процесса возвращается в переменную name_.
Может быть задан необязательный hunt signal. Этот сигнал запоминается ядром, пока процесс не появится в сети или вызывающий процесс не завершится. hunt_sig может быть установлен в NULL если hunt signal не предусмотрен.\\
Когда процесс найден или создан, вызывающему процессу приходит hunt signal, а идентификатор найденного процесса может быть извлечён вызовом [[sender]].\\
hunt signal возвращается немедленно, если процесс был сразу же найден, таким образом если hunt signal задан, он должен быть всегда принят, неважно, сразу или позже.\\
Ядро освобождает запланированный hunt signal если вызывающий процесс умирает.
==== Параметры ====
* **name** - указатель на имя процесса
* **user** - номер пользователя
* **name_** - идентификатор найденного процесса
* **hunt_sig** - указатель на буфер hunt-сигнала, если требуется
==== Возвращаемое значение ====
В параметр name_, если присутствует, заносится идентификатор найденного процесса. Идентификатор - гарантированно невалидный, если процесс не был сразу же найден.\\
Функция возвращает ноль, если процесс не может быть сразу найден. Если hunt signal был задан, он запоминается ядром до тех пор, пока нужный процесс не появится позже.\\
Возвращает неноль если процесс найден сразу. При этом если hunt signal задан, он посылается вызывающему процессу.\\
==== Ограничения ====
Ядро может переместить область, занятую hunt-сигналом. Таким образом, указатель на hunt-сигнал после вызова hunt является невалидным. Вызов hunt недоступен процессам прерываний. Вызов hunt может разрешить прерывания, если они были запрещены при вызове.
==== Примеры ====
#define SIXTH 6
struct Sixth
{
SIGSELECT sig_no;
}
union SIGNAL
{
SIGSELECT sig_no;
struct Sixth sixth;
};
...
static const SIGSELECT sel_sixth[] = {1, SIXTH};
union SIGNAL *huntsignal, *huntsignal2;
PROCESS huntproc_;
/* охота на процесс и ожидание сигнала отклика */
huntsignal = alloc( sizeof(struct Sixth), SIXTH);
(void) hunt( "proc", 0, (PROCESS*) NULL, &huntsignal);
huntsignal2 = receive( (SIGSELECT*) sel_sixth);
/* сохранение идентификатора найденного процесса */
huntproc_ = sender(&huntsignal2);
free_buf(&huntsignal2);
PROCESS pid;
if(hunt( "procname", NULL, &pid, NULL))
{
/* процесс найден */
}
==== См. также ====
[[create_process]]