Previous Entry Share Next Entry
close()
nepal
k001
А знаете ли вы, как правильно закрыть файловый дескриптор? Конечно, скажете вы: close(fd);.

А вот фига с два. Бывает так, что выполнение системного вызова close() прерывается, в этом случае вам вернут EINTR и нужно повторить вызов снова. Для этого glibc предоставляет удобный макроc: TEMP_FAILURE_RETRY (close (fd));.

На самом деле я не знаю, как часто происходит возврат из close() с EINTR. По дефолту, если у вас в коде определен _GNU_SOURCE или _BSD_SOURCE, такого не случается — в этом случае glibc сама возобновляет системный вызов после прерывания. Либо это можно выставить, поставив флаг SA_RESTART в sigaction для всех таких сигналов.
Tags:

  • 1
Забыл про то, что последний неуспех write(2) может иногда быть распознан только после close(2).

Забавно, что обработку этого случая недавно добавили в GNU Hello.

Фигасе. В каком смысле неуспех write? Где про это прочитать?

Из линуксячьего мана close(2):

NOTES

Not checking the return value of close is a common but nevertheless serious programming error. It is quite possible that errors on a previous write(2) operation are first reported at the final close(). Not checking the return value when closing the file may lead to silent loss of data. This can especially be observed with NFS and with disk quota.

(задумавшись) Хм. а когда close может завершиться с ошибкой? В смысле кто/когда может послать прерывание?

Например, если во время работы close нажать Ctrl-C.
Но я не представляю, как можно такого добиться. close() почти мгновенно срабатывает. Шансы, что за это время придут прерывания, близки к 0.

Знаем. Мы программировали под unix и читали "The rise of Worse Is Better" :-P

Вы-то знаете, это понятно :)

Мы знаем ;-)

  • 1
?

Log in

No account? Create an account