LINUX.ORG.RU

c++ fopen в неблокирующем режиме


0

1

Всем привет. Передо мной стоит задача юзать один и тот же файл нескольким пользователям. Например первые 4 байта это число, fread я его читаю и вижу, другой юзер это число изменяет fwrite и потом первый юзер если его прочитает оно будет изменено, и все это без закрытия файла. Как это сделать?

-_\\

Сделайте меня развидеть этот пост.

Shared memory. /thread

tensai_cirno ★★★★★
()

> Передо мной стоит задача

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

Manhunt ★★★★★
()

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

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

flock поможет.

Но задача действительно очень странная. Есть же куча более приличных способов (shm, сокеты, FIFO и т.п.).

Хотя, брешу: я такой способ использовал когда-то для общения CGI с основным потоком (через изменение переменных в mmap'ленной структуре). Синхронизация решалась при помощи shm'нутого мьютекса. Решение, конечно, хреновое, зато настройки сохранялись безо всяких «печенек».

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

1. flock на дескриптор, а не на требуемую ТС-ом FILE*
2. проблемы с ненужными буферами FILE*
3. write пишет count байт в файл, на который ссылается файловый дескриптор fd из буфера, на который указывает buf. POSIX требут, чтобы read(), который может использоваться после write() возвратил новые данные. Заметим, что не все файловые системы соответствуют стандарту POSIX.

Manhunt ★★★★★
()

Пост — ад и израиль, хотеть развидеть это срочно.

man shm_open

geekless ★★
()

Люди а как удалить байты например я fseek перешел на нужную позицию и хочу тупо вырезать следующие 4 байта... как это сделать?

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

Нужно делать временный файл и туда всё переписывать, кроме этих 4 байт, можно сделать какой-то маркер на эту зону, но это возни дольше и костылей, и траха.
Хотя может кто-то предложит лучший способ?!

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

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

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

> реализовать стирание байт как я уже сказал, и вставка в определенное место последовательности байт, непойму как это сделать

Никак. Тривиального и одновременно эффективного решения не существует. А прежде чем городить сложные решения, хорошо бы осознать, для чего тебе понадобилось так делать.

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

Можешь мапить зону для временного файла, если файлы большие.

Boy_from_Jungle ★★★★
()

Может просто open()/read()/write()?

Операции с обычными регулярными файлами атомарны. Или я не прав?

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