C C  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Сигналы

Тест проверяет сигналы как асинхронное вмешательство в выполнение: настройку sigaction, маски, узкий набор безопасных действий, мягкое завершение, диагностику и особенности многопоточных программ.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 6 темам.
Вопрос 1 из 30
Почему sigaction предпочтительнее signal для системной программы?
CC17
struct sigaction sa={0};
sa.sa_handler=on_term;
sigemptyset(&sa.sa_mask);
sigaction(SIGTERM,&sa,NULL);
Вопрос 2 из 30
Зачем обработчику сигнала сохранять и восстанавливать `errno`?
CC17
void h(int s){
  int saved=errno;
  flag=1;
  errno=saved;
}
Вопрос 3 из 30
Какой обработчик наиболее безопасен?
CC17
static void handler(int sig) {
    (void)sig;
    /* выбрать действие, допустимое в асинхронном обработчике */
}
Вопрос 4 из 30
Почему небезопасно публиковать из обработчика адрес локального буфера через глобальный указатель?
Вопрос 5 из 30
Что задаёт поле `sa_mask` структуры `sigaction`?
CC17
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask,SIGUSR1);
Вопрос 6 из 30
Зачем блокировать `SIGTERM` до создания рабочих потоков, если сигнал будет принимать отдельный поток через `sigwait`?
CC17
sigset_t set; sigemptyset(&set); sigaddset(&set,SIGTERM);
pthread_sigmask(SIG_BLOCK,&set,NULL);
/* затем создаём потоки */
Вопрос 7 из 30
Как избежать гонки между проверкой флага и переходом к ожиданию сигнала?
Вопрос 8 из 30
Что происходит с заблокированным обычным сигналом?
CC17
sigprocmask(SIG_BLOCK,&set,NULL);
raise(SIGUSR1);
raise(SIGUSR1);
Вопрос 9 из 30
Как проверить, заблокирован ли `SIGINT` в текущем потоке?
CC17
sigset_t cur;
/* дополните код проверкой текущей маски потока */
Вопрос 10 из 30
Можно ли заблокировать или обработать `SIGKILL`?
Вопрос 11 из 30
Почему `printf` нельзя считать безопасной функцией для асинхронного обработчика сигнала?
CC17
void h(int s){ printf("signal %d\n",s); }
Вопрос 12 из 30
Почему вызов `malloc` из обработчика сигнала может зависнуть?
Вопрос 13 из 30
Как безопасно передать событие из обработчика в цикл `poll`?
CC17
static int wake_fd;
void h(int s){ char b=(char)s; (void)write(wake_fd,&b,1); }
Вопрос 14 из 30
Достаточно ли `volatile sig_atomic_t count++` для точного подсчёта обычных сигналов?
Вопрос 15 из 30
Как проверить, допустим ли конкретный вызов из асинхронного обработчика сигнала?
CРевизия обработчика
void h(int s){
  /* перед добавлением вызова сверяем контракт функции */
}
Вопрос 16 из 30
Почему не стоит освобождать граф объектов прямо в обработчике `SIGTERM`?
Вопрос 17 из 30
Основной цикл блокирован в poll без таймаута. Как быстро сообщить ему о SIGTERM?
CC17
struct pollfd fds[]={{wake_read,POLLIN,0},{server,POLLIN,0}};
Вопрос 18 из 30
Какой порядок мягкой остановки сервера наиболее разумен?
CПорядок завершения
stop_accepting();
request_workers_stop();
join_workers();
close_resources();
Вопрос 19 из 30
Как обработать второй `SIGTERM` во время долгой мягкой остановки?
CМинимальное состояние
if(stop_requested) force_requested=1;
else stop_requested=1;
Вопрос 20 из 30
Почему флаг остановки нужно проверять в каждой точке продолжения цикла?
CC17
while(!stop){
  int rc=next_event(&ev);
  if(rc<0 && errno==EINTR) continue;
  if(rc>0) handle(&ev);
}
Вопрос 21 из 30
Какой инструмент Linux покажет в одной временной последовательности доставку сигналов и результаты прерванных системных вызовов процесса?
CДиагностика Linux
$ ____ -f -tt -e trace=signal,read,poll ./server
Вопрос 22 из 30
`read` вернул `-1` с `EINTR`. Нужно ли всегда безусловно повторять вызов?
CC17
if(n<0 && errno==EINTR){
  if(stop) break;
  continue;
}
Вопрос 23 из 30
Что полезнее всего при SIGSEGV в рабочем процессе?
Вопрос 24 из 30
Что прежде всего проверить, если процессный сигнал не попадает в ожидаемый поток?
Вопрос 25 из 30
Как проверить влияние флага `SA_RESTART` на конкретный системный вызов?
CC17
sa.sa_flags=SA_RESTART;
/* отправить сигнал во время блокирующего read и записать результат */
Вопрос 26 из 30
Чем гарантии стандартного C для обработчика сигнала уже гарантий POSIX?
Вопрос 27 из 30
Почему обычный SIGUSR1 плох как счётчик выполненных задач?
Вопрос 28 из 30
Как упростить обработку выбранных сигналов в многопоточной POSIX-программе, не выполняя сложную работу в асинхронном обработчике?
CC17
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGTERM);
/* выберите схему обработки для многопоточной программы */
Вопрос 29 из 30
Можно ли перехватить SIGSTOP?
Вопрос 30 из 30
Почему числовой номер сигнала нельзя считать переносимым кодом сетевого протокола?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу