2009-12-18 3 views
6

Мне нужно найти количество ожидающих сигналов в очереди сигналов потока в linux. Есть ли API, который предоставляется Linux?Как определить количество ожидающих сигналов в очереди сигналов unix (Linux)

Этот API необходимо вызывать из потока, кроме потока, который мы запрашиваем.

sigpending предоставляет API для вызывающей нити. Есть ли какой-либо API, который принимает thread id как arg и предоставляет некоторую информацию о ожидающих ожидания в очереди.

Любая помощь приветствуется.

ответ

3

Я не знаю такого API, но вот обходной путь: Напишите небольшую библиотеку, которая обертывает код сигнала. Когда вы посылаете сигнал, увеличьте атомный счетчик. Когда вы обрабатываете сигналы, уменьшите счетчик снова. Затем вы можете использовать этот атомный счетчик, чтобы ответить на ваше любопытство.

[EDIT] Если этого недостаточно, то у вас есть источник: просто изучите используемый код и структуры данных и используйте то, что вам нужно, заглянуть в структуры ядра. Но это может быть связано с написанием модуля (потому что структуры данных ядра не читаются процессом), плюс ваш код будет зависеть от ядра, на котором он был скомпилирован. Поэтому я советую против такого подхода.

+2

Это то, что я видел больше всего, чтобы найти ожидающие (несертифицированные) сигналы RT. Другие просто объединены (по типу) ядром в любом случае, что, возможно, стоит отметить. 10 000 SIGUSR1 доставлены как 1. –

6

sigpending() возвращает набор сигналов в ожидании доставки для потока. Вы можете перебрать этот файл sigset_t и использовать sigismember() для проверки членства.

Традиционно UNIX не ставит в очередь более одного экземпляра сигнала (в этом смысле они по-прежнему остаются «ненадежными»). Иногда вы можете получить этот эффект с помощью сигналов в реальном времени.

В Linux, чтение() ing из signalfd позволит сразу считывать более одного экземпляра сигнала, если они будут поставлены в очередь.

Смежные вопросы