Посылаются ли сигналы прерывания во время вызовов библиотеки fread () и fwrite ()? - PullRequest
0 голосов
/ 11 ноября 2018

В Linux вызовы стандартной библиотеки C fread и fwrite выполняют эквиваленты системных вызовов, read и write.

В справочных страницах по системным вызовам упоминаются прерывания, говорящие о том, что может произойти короткая запись с errno, установленным на EINTR. Однако страницы руководства для функций библиотеки ничего не говорят о прерываниях. Итак, могут ли прерывания происходить во время этих библиотечных функций?

https://linux.die.net/man/3/fwrite

1 Ответ

0 голосов
/ 11 ноября 2018

Прерывания могут возникать при выполнении функций fread() и fwrite() (и при read() и write() системные вызовы - остановить это невозможно. Однако не очень понятно, что происходит, если происходит прерывание - доставляется ли сигнал или нет. Это зависит от того, как настроено ваше приложение (поток?) для обработки прерываний.

  • Если он их игнорирует, то эффект fread() или fwrite().
  • Если он имеет обработку по умолчанию, программа остановится; функции не возвращаются.
  • Если ваш обработчик сигнала завершает работу или использует siglongjmp() (или longjmp()), то системный вызов не вернется.
  • Если ваш обработчик вернется, это будет зависеть от того, что вы указали для sigaction() при настройке обработчика.
    • SA_RESTART означает, что базовый read или write будет повторен
    • Нет SA_RESTART будет означать, что read или write завершится - возможно, с коротким чтением или записью, или, возможно, с ошибкой и errno, установленным в EINTR.
    • Если системный вызов указывает на сбой, вполне вероятно, что fread() и fwrite() также сообщат о сбое, если данные не были прочитаны или записаны до того, как произошло прерывание.
    • Если некоторые данные были прочитаны или записаны, вы, вероятно, получите короткий ответ на чтение или запись.
...