В чем разница между закрытием [close (3)] и очисткой [fd_clr (3)] файлового дескриптора? - PullRequest
0 голосов
/ 25 июня 2019

У меня проблемы с автоматическим тестированием программного обеспечения, которое обвиняет использование освобожденного ресурса, когда я использую fd_clr (3) после использования close (3) в fd. Что-то не так с этим?

for(i = 0; i < nfds; ++i) {
    if (FD_ISSET(i, &myFdSet)) {
        close(i);
        FD_CLR(i, &myFdSet);
    }
}

Ответы [ 3 ]

1 голос
/ 25 июня 2019

FD_CLR() изменяет только локальный fd_set, который представляет собой структуру данных C для хранения информации о списке файловых дескрипторов.

close() - системный вызов, закрывающий файловый дескриптор.

fd_set используется в системном вызове select()select() вы получаете информацию о состоянии списка файловых дескрипторов, которые хранятся в вашей fd_set struct.

Причина, по которой вы видите FD_CLR() чуть ниже close(), заключается в том, чтобольше нет необходимости / цели в запросе состояния, если описатель закрытого файла.

0 голосов
/ 25 июня 2019

Если программное обеспечение действительно помечает такое использование FD_CLR, автоматизированное программное обеспечение не работает.Вы удаляете закрытый файловый дескриптор из отслеживаемого набора, и FD_CLR является именно таким способом.

В качестве обходного пути вы можете транспонировать close() иFD_CLR, который не изменит смысла кода, но утешит инструмент анализа ошибок.

0 голосов
/ 25 июня 2019

Итак, FD_ISSET и FD_CLR являются частью API pselect, подробнее на man-странице здесь http://man7.org/linux/man-pages/man3/FD_CLR.3.html

Это в основном управление списком всех номеров файлов, которые вы хотите ждать, в вашемследующий вызов pselect, поэтому очистка закрытого файла имеет смысл.

Ваш код запрашивает для всех файлов, которые я прослушивал, закрыть файл и удалить из набора.

close () фактически закрывает файл.Вы не должны вызывать close несколько раз для одного и того же файла, иначе вы увидите эту ошибку.Возможно, какой-то другой код также закрывает файл?

...