2015-12-15 3 views
1

Это небольшая часть результатов, которые следует выполнить до this question.Приостановление выполнения нитей в обработчике сигналов

Предположим, что я использую sigaction, чтобы настроить обработчик сигналов моего собственного дизайна. В этом обработчике сигналов я получаю информацию о состоянии CPU (например, указатель стека потока) и копирую его в заданное место в памяти. Теперь я хочу проверить значение в стеке этого потока из другого потока.

Есть ли способ приостановить выполнение потока в обработчике сигнала из одного обработчика сигнала, чтобы я мог безопасно исследовать стек этого потока из другого потока? (Примечание: я определяю «безопасно» здесь, чтобы означать «не беспокоясь о завершении или возврате нити из функции.)

Если я был снаружи обработчика сигналов, я мог бы использовать sigsupend, однако использовать его небезопасно внутри обработчика сигнала в соответствии с the GNU documentation. Я мог бы также попытаться простирающийся сигнал, используя метод, описанный в this question, но я не думаю, что любой стандартный * NIX сигналы поможет мне здесь.

ответ

2

read блокирующий на трубе является async-signal-safe и обеспечивает удобный способ пробуждения вашей «подвешенной» нити.

Например,

static int the_pipe[2] = {-1, -1}; // file descriptors allocated in main via pipe() 

static void 
siginfo_handler(int s, siginfo_t *si, void *ctx) { 
    char c; 

    // do something with (ucontext_t *)ctx 

    // now wait for someone else to wake us up 
    read(the_pipe[0], &c, 1); 

    ... 
} 
+0

Я не уверен, что я следую - я ищу, чтобы приостановить нить в первую очередь, а не разбудить ее. Не могли бы вы продумать, пожалуйста? – tonysdg

+0

Где вы хотите использовать 'sigsuspend',' read (pipefd, ...) 'вместо этого. Является ли измененный ответ более ясным? Вы можете удерживать нить до тех пор, пока вам нравится, и разбудить ее, написав на другом конце трубы. – pilcrow

+0

Намного яснее - спасибо !! – tonysdg

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