LINUX.ORG.RU

fstream и flock


0

0

Как в C++ заблокировать файл? flock ведь ожидает в качестве первого параметра дескриптор файла, а не класс... Поискал в Интернете, не нашёл работающего решения. Где-то советовалось реализовать для чего-то собственный класс, но это странно, вроде бы блокирование файла - это очень часто используемая операция, и должен быть способ это сделать в одну строку.

★★★★

Насколько я понял, проблема нормально не решается.

Дело в том, что flock и другие функции, которым мог бы понадобиться файловый дескриптор относятся не к языку C/C++, а к POSIX и про стандартный переносимый способ вытащить дескриптор из fstream я как-то не слышал.

Можно предложить несколько способов решить возникшую проблему.

1)Отказаться от fstream вообще и работать с файлами через open.

2)Параллельно с fstream сделать и open, блокировками заниматься используя дескриптор, полученный через open, а остальную работу делать через open. Способ грязноватый, ибо как я понимаю, существует небольшая вероятность, что fstream::open(...) и open(...) станут указывать на разные файлы, если в промежутке между вызовами кто-то успеет удалить (убрать ссылку) на один файл, а потом присвоить имя другому файлу. К тому же я чувствую, что при fork()'ах могут возникнуть некоторые неочевидные ситуации. Тем не менее, должно по идее работать в большинстве случаев.

3)Использовать детали реализации. Например, написать новый класс, наследующий fstream с добавлением функций типа flock(). А может уже кто-то это сделал.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

> 1)Отказаться от fstream вообще и работать с файлами через open.

а если уже есть большая и толстая система, которая ожидает на вход именно *stream? вариант так себе IMHO. впрочем, зависит от конкретной ситуации.

> 2)Параллельно с fstream сделать и open, блокировками заниматься используя дескриптор, полученный через open, а остальную работу делать через open. Способ грязноватый, ибо как я понимаю, существует небольшая вероятность, что fstream::open(...) и open(...) станут указывать на разные файлы, если в промежутке между вызовами кто-то успеет удалить (убрать ссылку) на один файл, а потом присвоить имя другому файлу. К тому же я чувствую, что при fork()'ах могут возникнуть некоторые неочевидные ситуации. Тем не менее, должно по идее работать в большинстве случаев.

race is my friend
рано или поздно стреляет даже палка, висящая на стене
не катит

> 3)Использовать детали реализации. Например, написать новый класс, наследующий fstream с добавлением функций типа flock(). А может уже кто-то это сделал.

это уже ближе к истине. а разработчику и админу хоста не забыть, что есть mandatory и advisory locks со всеми вытекающими.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous_incognito

> и про стандартный переносимый способ вытащить дескриптор из fstream я как-то не слышал.

Это потому как его из стандарта выкинули до того как ты стал изучать ++ ;) А в первых версиях таковой был. Для того чтобы поддержать совместимость со старыми версиями для *NIX-ов пришлось использовать гнутое расширение (__gnu_cxx::stdio_filebuf) а вот уиндоус версия пошла лесом :(

sS ★★★★★
()
Ответ на: комментарий от sS

> Это потому как его из стандарта выкинули до того как ты стал изучать ++ ;) А в первых версиях таковой был.

Занятно. Зачем же убрали. А какой синтаксис был?

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

>Занятно. Зачем же убрали.

Якобы для совместимости. Не во всех системах есть понятие файлового дескриптора

>А какой синтаксис был?

int filedesc();

sS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.