Linux-эквивалент Windows-хуков - PullRequest
2 голосов
/ 01 ноября 2011

Я хотел бы знать, как выразить что-то вроде оконного хука в Linux.

У меня есть приложение Linux с различными потоками.Основной поток в настоящее время установил обработчик сигнала для ctrl c , перехватывает его и закрывает приложение.

Я хотел бы, чтобы другой поток в приложении обрабатывал ctrl c событие, а затем передача в основной поток.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Насколько я знаю, это было бы сложно сделать.Unix сигналы примитивны.

Сигналы доставляются в случайный поток по умолчанию.Чтобы обойти это, обычно используется хитрость - блокировать сигналы во всех потоках, кроме одного.Самый простой способ сделать это - заблокировать все сигналы в основном с помощью pthread_sigmask, затем создать потоки (которые будут наследовать маску сигналов), а затем создать отдельный поток, который выполняет sigwait/sigwaitinfo для заблокированных сигналов.Это вынуждает сигналы доставляться в этот поток.

После использования сигнала в потоке захвата сигнала вам нужно будет сделать pthread_kill с идентификатором основного потока и номером перехваченного сигнала, чтобы переслать сигнал наглавный.Проблема в том, что main блокировал бы его.

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

Вы можете сделать так, чтобы сигнальный поток отправлял сообщение main через какую-то другую форму IPC (канал или что-то еще), говоря: «поймал XX, примите соответствующие меры».Может быть, этого достаточно?

Может быть, у кого-то есть какая-то умная идея, но я подозреваю, что суть в том, что это просто не то, что обычно делается в unix.

0 голосов
/ 01 ноября 2011

Другой прием (предложенный документацией Qt ) может заключаться в том, чтобы иметь обработчик сигнала, записывающий (например, один байт) в канал, и иметь некоторый поток, либо просто какой-то обработчик события (например, )g_io_add_watch с GTK) обрабатывает байт.

...