2016-07-24 3 views
1

Как передать аргументы (например, указатель на структуру) обработчику сигналов? Я пишу многопоточное приложение, поэтому не могу использовать глобальные переменныеПередача аргументов обработчику сигнала в C

Я связываю таймер с каждой нитью. По истечении таймера я должен обновить структуру (каждый поток имеет другую структуру).

Как я могу это сделать?

+0

Как насчет использования локальной переменной потока? –

+0

Как передать локальную переменную потока в обработчик сигналов? – WindowsEFI

+0

Можете ли вы быть более ясными? Скажите нам, какой тип сигнала? И какой формат вы хотите! –

ответ

0

Способ устранения обработчика сигнала системой - нет возможности изменить его и добавить дополнительный указатель пользователя. Поэтому, если вы хотите получить дополнительные данные в обработчик сигнала, единственный способ сделать это - это глобальная переменная (которая может быть нить-локальной).

Однако, если вы пытаетесь использовать timer_create с помощью резьбы, вам гораздо лучше использовать SIGEV_THREAD, а не SIGEV_SIGNAL. Последний посылает сигнал на процесс, а не на поток , поэтому он может быть пойман любой нитью в процессе.

+0

glibc, как представляется, выделяет _Thread_local переменные лениво и динамически (с вызовами-фактами с успешным или-умирающим, которые мне не очень нравятся), поэтому кажется, что первый доступ к _Thread_local может быть AS-небезопасным. Однако я не мог найти больше информации об этом. – PSkocik

0

Таймеры POSIX позволяют указать детали того, как ваш процесс будет уведомлен об истечении срока действия с использованием структуры struct sigevent, зарегистрированной в sigevent(7).

Чтобы передать контекстную информацию в siggnal обработчика для генерируемого сигнала, вы можете установить .sigev_value.sival_ptr элемент, который обработчик сигнала будет иметь возможность получить (вам нужно установить обработчик сигнала с помощью .sa_sigaction члена struct sigaction , при этом убедитесь, что .sa_flags структуры OR OR с SA_SIGACTION).