2010-12-13 3 views
4

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

Я пробовал делать это через эксклюзивные блокировки файлов, но мне не повезло. Кроме того, блокировки файлов очень не кросс-платформенные (это необходимо для работы в Solaris, Linux и Windows).

Любые предложения?

ответ

0

Это не правильный модульный тест, если вы полагаетесь на открытие \ закрытие файлов, подобных этому - такие тесты могут случайным образом выходить из строя по разным причинам, что приводит к ложным срабатываниям и общей путанице.

Вместо этого рассмотрите абстрагирование операций с файлами и убедитесь, что на ваше представление файла вызывается close.

+0

Точка хорошо приняты. –

1

Невозможно проверить, открыт ли файл-дескриптор или нет.

Если вы используете C++, вы можете просто использовать RAII, и вам не придется беспокоиться о незакрытых файлах.

В противном случае вы никогда не сможете вызывать системные API и вместо этого обращаться к вашим API-интерфейсам обертки. Каждый раз, когда вы открываете, вы можете добавить путь к вектору, все, что вы закрываете, может удалить этот путь. В конце просто проверьте, есть ли у вас нулевой размер на вашем векторе.

1

Вы можете проверить его с помощью select и poll. Выберите вернет EBADF, если дескриптор файла закрыт:

fd_set rfds; 
struct timeval tv = { 0, 1 }; 
int retval; 

FD_ZERO(&rfds); 
FD_SET(fd, &rfds); 

retval = select(1, &rfds, NULL, NULL, &tv); 
if (retval == -1 && errno == EBADF) 
    // File is closed 

Примечание, что я не проверял этот код, но документация говорит это.

Также, это не совсем точно, так как errno может быть EBADF по разным причинам.

EDIT: Другое дело: если вы откроете файл сразу после закрытия другого, у него, скорее всего, будет тот же самый fd, что и предыдущий, так что это работает только полупристойно, если вы хотите проверить, были ли все файлы закрыты.

+1

Конечно, это не сработает, если файл был закрыт, но был открыт другой файл и ему присвоен тот же файловый дескриптор (что вполне вероятно, учитывая стратегию выделения дескриптора файла). –

+0

@Adam Да, но это не может помочь. Но он работает, если он просто хочет проверить, были ли все файлы закрыты. Но я добавлю, спасибо. – terminus

1

В Unix/Solaris/Linux вы можете изучить /proc/ pid /fd/*, если вы знаете pid. Вы также можете просмотреть все записи/proc/*/fd.

Для Windows я бы посмотрел, что делает инструмент sysinternals.com ProcMon, который теперь называется Process Monitor. Я не могу вспомнить, был ли исходный код доступным для этого или нет.

2

Если вы хотите узнать, открыт ли какой-либо файл в файловой системе каким-либо процессом на машине, есть полезный инструмент под названием lsof, который может рассказать вам об этом для различных Unix-систем и Unix-подобных систем.

Смежные вопросы