Могу ли я дважды вызвать shutdown для файлового дескриптора на языке C? - PullRequest
2 голосов
/ 13 ноября 2010

Я использую c.У меня есть fd1 в качестве дескриптора файла, могу ли я вызвать это дважды?

main () {
....
shutdown(fd1, SHUT_WR);
....
shutdown(fd1, SHUT_WR);
....
}

Лично я думаю, что это работает, потому что fd1 еще не был действительно бесплатным.Просто хочу, чтобы кто-то подтвердил.

Ответы [ 4 ]

2 голосов
/ 13 ноября 2010

Вы должны проверить возвращаемое значение второго вызова - shutdown(2), вероятно, возвращает -1 - и проверить значение errno(3).

1 голос
/ 27 марта 2014

В моей версии Linux и glibc я могу вызывать shutdown несколько раз на одном и том же открытом сокете.Он будет счастливо возвращать 0 до тех пор, пока сокет не будет фактически разрушен в этом направлении, а затем вернет -1 с помощью errno == ENOTCONN.Он не вернет EBADF, пока вы не close FD, и тогда вам все равно не следует использовать этот FD.

Этот факт на самом деле довольно полезен, поскольку вы можете вызывать shutdown в цикле по порядку.обнаружить, что соединение было разорвано так или иначе.epoll Обнаружение ошибок в сокете, похоже, разбудит его в нужное время.

0 голосов
/ 13 ноября 2010

Вызов shutdown просто инициирует последовательность отключения уровня TCP. Дескриптор сокета никогда не освобождается для повторного использования, пока вы не вызовете для него close.

Вы можете звонить shutdown так часто, как хотите, хотя вполне вероятно, что последующие вызовы приведут к ошибке.

Позвоните close, когда закончите с сокетом.

0 голосов
/ 13 ноября 2010

Вы можете вызвать его один раз, чтобы отключить выход, и еще раз, чтобы отключить вход, или наоборот.Вызов его дважды для отключения выхода, безусловно, не отправит два FIN, что бы он ни делал.Вызов дважды, чтобы отключить вход, также не может ничего сделать дважды.Так что ни один из них не может иметь какой-либо реальной точки.

NB. Вы не можете вызвать ее для дескриптора file вообще.Вы можете вызвать его по дескриптору socket .

...