А знаете ли вы, как правильно закрыть файловый дескриптор? Конечно, скажете вы: close(fd);
.
А вот фига с два. Бывает так, что выполнение системного вызова close() прерывается, в этом случае вам вернут EINTR и нужно повторить вызов снова. Для этого glibc предоставляет удобный макроc: TEMP_FAILURE_RETRY (close (fd));
.
На самом деле я не знаю, как часто происходит возврат из close() с EINTR. По дефолту, если у вас в коде определен _GNU_SOURCE или _BSD_SOURCE, такого не случается — в этом случае glibc сама возобновляет системный вызов после прерывания. Либо это можно выставить, поставив флаг SA_RESTART в sigaction для всех таких сигналов.
Page Summary
![]() ![]() ![]() |
close()
Забыл про то, что последний неуспех write(2) может иногда быть распознан только после close(2). Из линуксячьего мана close(2): (задумавшись) Хм. а когда close может завершиться с ошибкой? В смысле кто/когда может послать прерывание? Например, если во время работы close нажать Ctrl-C. |