LINUX.ORG.RU

работа с сигналами


0

0

поясните мне вот такую ситтуацию выполняется функция обрабатывается какойто объект , и в этот момент программа получает сигнал (HUP или ещё какой-нибудь). как я понимаю выполнение текущей операции обрывается и вызывается обработчик сигнала, а не получится ли так что какието данные изза этого могут потеряться ?

anonymous
Ответ на: комментарий от idle

>и опять-таки при возвращении в userspace из do_IRQ() безусловно... сигналы обрабатываются в userspace, поэтому туда нужно вернуться, чтобы его обработать. под словом "сразу" подразумевалась фиксированная задержка (которую можно посчитать в отличие от sys_read/sys_write, которые на ожидании страницы могут провести любое время) и по факту довольно небольшая.

>s/сигнал/syscall/ разумеется системные вызов. извиняюсь за описку. :)

>только при ERESTARTSYS. есть еще ERESTARTNOINTR да есть и такое но резюме остается прежним:

семантика обработки сигналов очень сильно завязана на конкретном коде ядра (а именно errno=-orig_eax=возвращаемому из sys-функции коду)

то есть в принципе: 1) обработка сигнала может быть отложена до упора 2) сигнал может быть обработан условным кодом ядра без перезапуска (EINTR) 3) сигнал может быть обработан с пожеланием перезапуска (ERESTART...) и фактическим перезапуском 4) сигнал может быть обработан с пожеланием перезапуска, но без соответствующих флажков в sigaction 5) все что угодно

это я и назвал кашей...

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

Murr ★★
()
Ответ на: комментарий от Murr

извиняюсь за форматирование... подзабыл, что по умолчанию такая голиматья с переносом строк. :)

Murr ★★
()
Ответ на: комментарий от Murr

мы, похоже, одновременно писали :)

я и не говорил, что вы в чем-то не правы, см
мой предыдущий пост, только он почему-то анонимным
получился :)

idle ★★★★★
()
Ответ на: комментарий от idle

Ага... одновременно. :)

Надеюсь, автор из моих сообщений что-нибудь разберет.
То, что из ваших разберет - это уж точно. :)

Блин, а вообще пора возвращаться к Linux... а то после полгода ничегонеделания мне даже в голову не пришло, что сигнал может придти во время прерывания. :)

Murr ★★
()
Ответ на: комментарий от Murr

> а именно errno=-orig_eax=возвращаемому из sys-функции коду

Ой! а вот здесь не правы. orig_eax - это то, с чем
мы _пришли_ в ядро. либо там номер вызова, либо там
-номер_прерывания. посмотрите на if (regs->orig_eax >= 0)
в handle_signal(). возврат всегда лежит в eax.

idle ★★★★★
()
Ответ на: комментарий от idle

ну да, просто eax. в orig_eax же сохраняется номер системного вызова для обратного вызова ptrace-сервера. :)

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.