Как я могу узнать, что я единственный, у кого открыт дескриптор файла? - PullRequest
0 голосов
/ 25 января 2010

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

Одна проблема, с которой я столкнулся, это знание того, что мой код C ++ открыл файл, с которым завершил отправляющий сервер, то есть локальный FTP-сервер все еще не пишет.

В Solaris, как я могу открыть файл и знать со 100% уверенностью, что его никто не открыл?

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

Ответы [ 2 ]

1 голос
/ 25 января 2010

Вы можете использовать flock () с операцией LOCK_EX для обеспечения монопольного доступа. fcntl () - другой возможный способ

#include <sys/file.h>

int flock(int fd, int operation);   

РЕДАКТИРОВАТЬ: Два способа сделать это, найти FTP-сервер, который блокирует файл во время получения. Боюсь, что вы не будете на 100% в безопасности, если будете следить за процессом ftp-сервера, используя pfiles или lsof (который доступен здесь http://www.sunfreeware.com/), чтобы убедиться, что никто другой не обращается к файлам.

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

0 голосов
/ 25 января 2010

Является ли процесс, который подает файлы в каталог, принадлежит вам? Если это так, переименуйте расширение файла в .working, чтобы вы не подняли используемый файл.

РЕДАКТИРОВАТЬ: Поскольку вы сказали, что это Solaris, напишите сценарий оболочки и используйте команду pfiles, чтобы проверить, использует ли процесс файл, который вы хотите использовать. Если не начать обработку файла.

...