Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TerminateProcess


Страницы:   1 2 3 4 5 6 7

Суслик ©   (2005-04-25 14:53:00) 

Добрый день.

Есть такой псевдокод:

... запись в файл 200 мб из памяти
sleep(500);
TerminateProcess(GetCurrentProcess);


Вопрос: почему система ждет, когда файл запишется и только потом приложение закрывается? Вернее, почему файл оказывается записанным?

ЗЫ. win2000 server, диски ntfs и fat32.


alpet   (2005-04-26 18:32:00) [41]

Sha ©   (26.04.05 18:19) [95]

> наша приграмма ни при каких условиях сделать этого не могла.


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


Sha   (2005-04-26 18:19:00) [42]

> Суслик ©   (26.04.05 17:57) [92]

Эксперимент (на W2K) подтверждает, что FlushFileBuffers - синхронная операция, и управление к тебе не вернется до завершения записи данных и метаданных на диск:


procedure TSenderForm.Button1Click(Sender: TObject);
var
 fi: file;
 i: integer;
 s: string;
begin
 SetLength(s,1024);
 AssignFile(fi,'aaa'); Rewrite(fi,1);
 for i:=1 to 1024*1024 do BlockWrite(fi,s[1],Length(s));
 FlushFileBuffers(TFileRec(fi).Handle);
 ShowMessage('ccc');
 CloseFile(fi);
end;


Пускаем сие чудо, а файлик смотрим Far'ом.

> alpet ©   (26.04.05 18:02) [94]
> г) Есть только файл data.txt но он безнадежно поврежден.

наша приграмма ни при каких условиях сделать этого не могла.


alpet   (2005-04-26 18:02:00) [43]

Sha ©   (26.04.05 17:58) [93]
Четвертое состояние:
г) Есть только файл data.txt но он безнадежно поврежден.

Как быть?


Sha   (2005-04-26 17:58:00) [44]

alpet ©   (26.04.05 17:44) [89]

Возможны 3 состояния:
a) есть только файл data.txt,
б) есть файл data.txt и data.tmp,
в) есть только файл data.tmp.

В случаях а) и б) - правильный файл data.txt.
В случае в) - правильный файл data.tmp. Переименовываем и продолжаем работать.


Суслик   (2005-04-26 17:57:00) [45]


>  [91] mgcr ©   (26.04.05 17:53)

таки ты хочешь сказать, что система обо мне сама позаботится, сбой произойдет при FlushFileBuffers, то при сосстановлении система восстановит исходное значение файла?

Не верю, быть такого не может. А если файл 1гб?

Или ты что-то другое имел в виду?


mgcr   (2005-04-26 17:53:00) [46]


> Может быть пока идет скидывание комп упадет и не скинется
> до конца - половина новая, половина старая. Где гарантия,
> что этого не будет?


В End-Of-File pointer


alpet   (2005-04-26 17:47:00) [47]

Суслик ©   (26.04.05 17:42) [88]
Пока FFB скидывает содержимое буферов на диск - управление не вернется. Если после ее отработки закрыть описатель файла, и создать второй (копию 1:1) и обойтись с ним так же, о наличии сбоя можно будет судить по отсутствию второго файла (до него просто дело не дойдет) либо по наличию отличий между вторым и первым файлом.


alpet   (2005-04-26 17:44:00) [48]

Sha ©   (26.04.05 17:38) [86]
2. Как иначе доказать что файл был записан полностью, а не частично?
3. Это только метод перестраховки (вирусы, проблемы с жестким диском).


Суслик   (2005-04-26 17:42:00) [49]


>  [86] Sha ©   (26.04.05 17:38)
> > alpet ©   (26.04.05 17:22) [83]
> Вроде п.п. 2 и 3 лишние

как раз вопрос о транзакционности flushfilebuffer. Может быть пока идет скидывание комп упадет и не скинется до конца - половина новая, половина старая. Где гарантия, что этого не будет?


Sha   (2005-04-26 17:41:00) [50]

> mgcr ©   (26.04.05 17:35) [85]
> Был во время оно на ЕС такой продукт Librarian...
> Не знакомо ?

Неа, у меня был свой...


Sha   (2005-04-26 17:38:00) [51]

> alpet ©   (26.04.05 17:22) [83]
Вроде п.п. 2 и 3 лишние


mgcr   (2005-04-26 17:35:00) [52]

Sha ©   (26.04.05 13:35) [59]

<offtopic>

> > Это я к тому, что цепочечную файловую систему трудно сделать
> надежной
>
> Делал, и даже на ЕС.


Был во время оно на ЕС такой продукт Librarian (отечественный вариант носил название "Ритм") со всякими Jobstream-файлами и аккурат цепочечной организацией внутренних файлов данных, в отличие от экстентной.
Не знакомо ?

</offtopic>


Sha   (2005-04-26 17:31:00) [53]

Тут важный момент: Close сам не обновляет даннае в оглавлении, а лишь просит ОС сделать это.
Отсюда выводы:
- Выполнение Close не гарантирует обновление метаданных при отключении питания,
- То, что отложеный вызов FlushFileBuffers делает ОС увеличивает быстродействие приложения,
- Самостоятельно вызывая FlushFileBuffers ты обновляешь данные в оглавлении, но проигрываешь в скорости.


alpet   (2005-04-26 17:22:00) [54]

Маленький итог:
1. Необходимо - сбрасывать данные на жесткий диск принудительно.
Самое простое для этого использовать функцию FFB (FlushFileBuffers).
2. После завершения этой операции создавать дополнительный файл как доказательство что первый уже записался.
3. Дополнительно: Как защиту от непредвиденных ситуаций можно создавать копию первого файла.

Что еще не хватает для решения задачи?


Sha   (2005-04-26 17:20:00) [55]

> Суслик ©   (26.04.05 16:51) [80]
Можно проверить


procedure TSenderForm.Button1Click(Sender: TObject);
var
 fi: file;
begin
 AssignFile(fi,'aaa'); Rewrite(fi,1);
 BlockWrite(fi,'bbb',3);
 //FlushFileBuffers(TFileRec(fi).Handle);
 ShowMessage('ccc');
 CloseFile(fi);
end;


Пускаем как есть, OK не говорим.
Под 98 размер файла должен быть 0.
Говорим OK - размер меняется на 3.
Значит метаданные в оглавлении обновляются по Close.

Повторяем с раскомментированным FlushFileBuffers.
Видим, что метаданные обновлены до Close.
Все как ты хотел.


mgcr   (2005-04-26 17:01:00) [56]

Суслик ©   (26.04.05 16:23) [78]


> Сохранение раз в 10 минут файла до 3 мб таким образом, чтобы
> при аппаратных сбоях (выключение компьютера) при последующем
> восстановлении либо было понятно, что произошел сбой (т.е.
> новый файл не дописался), либо новый файл дописался и информации
> о сбое нет. В первом случае происходит восстановление старого
> файла


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


Суслик   (2005-04-26 16:51:00) [57]


> Если не в сети, то должно может будет достататочно FlushFileBuffers,
> как советовал mgcr ?

Да я тоже так думаю, что достаточно.
Т.е. ты тоже думаешь, что достаточно?


Sha   (2005-04-26 16:43:00) [58]

Суслик ©   (26.04.05 16:23) [78]

Если не в сети, то должно может будет достататочно FlushFileBuffers, как советовал mgcr ?


Суслик   (2005-04-26 16:23:00) [59]


>  [77] mgcr ©   (26.04.05 16:14)

Да я вроде все объяснил где-то выше.
Дабы не искать повторю:
Сохранение раз в 10 минут файла до 3 мб таким образом, чтобы при аппаратных сбоях (выключение компьютера) при последующем восстановлении либо было понятно, что произошел сбой (т.е. новый файл не дописался), либо новый файл дописался и информации о сбое нет. В первом случае происходит восстановление старого файла.

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

Должно работать в 98 и 2000, на ntfs и fat.


mgcr   (2005-04-26 16:14:00) [60]

Суслик ©   (26.04.05 16:09) [76]


> Конкрентый вопрос - делал ли кто-то сам то, что мне нужно
> на win98 и win2000?


А что тебе нужно, ты как гимназистка, объясняешь туманными полунамеками.


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо