LINUX.ORG.RU
ФорумTalks

о файлах

 


0

1

один и тот же файл 2 раза неэксклюзивно открыт в разных программах. В программе A на чтение, в программе B на запись.

Что происходит в правильно спроектированной системе с читателем(B), когда писатель(А) изменил (добавил) в тот кусок файла, который читатель(B) давным-давно прочитал? В частности, с текущей позицией в файле.

Олсо, программа Х пайпает У некий файл, а У сливает его в тот же самый файл. В передельном случае это cat ./asd > ./asd. Что должно происходить при этом в правильно спроектированной системе?

И почему у нас не так? :)

★★★★☆

1. Читатель B видит версию файла на момент открытия.
2. В нормальной системе (и в любой другой) надо за это оторвать руки. Возможна проблема race condition.

Black_Shadow ★★★★★
()
$ cat ./test > ./test
cat: ./test: ввод и вывод в один файл

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

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

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

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

1. Читатель B видит версию файла на момент открытия.

Такое только в нормальных БД гарантируется, а не просто файл в фс

af5 ★★★★★
()
$ echo 1234 > t.img
$ dd if=t.img | dd of=t.img
0+1 записей получено
0+1 записей отправлено
 скопировано 5 байт (5 B), 0,000111925 c, 44,7 kB/c
0+1 записей получено
0+1 записей отправлено
 скопировано 5 байт (5 B), 0,000148983 c, 33,6 kB/c
$ cat t.img
1234
$ dd if=t.img | dd of=t.img
0+0 записей получено
0+0 записей отправлено
 скопировано 0 байт (0 B), 9,1112e-05 c, 0,0 kB/c
0+0 записей получено
0+0 записей отправлено
 скопировано 0 байт (0 B), 0,0012809 c, 0,0 kB/c
$ cat t.img
$
Black_Shadow ★★★★★
()

Kwrite и Kate говорят - сей файл был изменен с момента открытия. Что делать?

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

Geany как-то чует изменения. Если что-то сделать с файлом, например отредактировать, появляется окошко с вопросом, оставить как есть или обновить.

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

Да, ты прав. Видимо поэтому моя система не дает осуществить фокус с выводом cat в тот же файл.

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

Тестит mtime по таймеру или использует разновидность fam.

arturpub ★★
()

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

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

Ну зачем ты пишешь про то, в чём не разбираешься?

Файл считывается и загружается в память.

Зачем? а если размер файла 2TB?

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

Не должна. Почитай про fanotify и inotify.

Black_Shadow ★★★★★
()

В программе A на чтение, в программе B на запись.
когда писатель(А) изменил (добавил) в тот кусок файла

ENOPERM

NightSpamer
()
Ответ на: комментарий от arturpub

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

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

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

Это да. Но с прочтением твоих сообщений всё равно ничто не сравнится :-)

Black_Shadow ★★★★★
()

GEdit, например, сообщает что файл изменился и предлагает переоткрыть. Больше ни в чем не пробовал.

NeverLoved ★★★★★
()

ЯННП, но УМВР:

Notepad++ если откртый в нем файл я где-то еще изменил, то блокнот пишет «файл изменился: перезагрузить обновленный или оставить как есть?».

dk-
()

Стиви, а тебе интересно как правильно проектировать части системы, или ты ищешь правильно спроектированную систему, или тебе все равно на систему, главное узнать, что должно быть, если она правильная? И почему у кого и как?

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

Notepad++ если откртый в нем файл я где-то еще изменил, то блокнот пишет «файл изменился: перезагрузить обновленный или оставить как есть?».

Подтверждаю.

wintrolls ☆☆
()

Если файл типа FB2, A это редактор, B это просмотровщик okular, то когда редактор сохраняет файл, okular сразу его перечитывает. ХЗ, «правильно» ли это спроектировано, но редактировать электронную книгу удобно. Так что зависит.

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