Открываем файл,

User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

vc wrote:'rm' does not open the file, 'rm' removes a directory entry, a directory entry cannot be locked, 'rm' cannot be prevented from happenning. I thought we've been through this...

Locking can only prevent a file from being overwritten as I showed in my example.

VC

Прекрасно. Вернемся к оригинальному вопросу - как выловить что файл был "rm-ed"?
Единственно приходит в голову - периодически чекать директори ентри.
Верить нельзя никому - даже себе. Мне - можно!
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

A. Fig Lee wrote:
vc wrote:'rm' does not open the file, 'rm' removes a directory entry, a directory entry cannot be locked, 'rm' cannot be prevented from happenning. I thought we've been through this...

Locking can only prevent a file from being overwritten as I showed in my example.

VC

Прекрасно. Вернемся к оригинальному вопросу - как выловить что файл был "rm-ed"?
Единственно приходит в голову - периодически чекать директори ентри.


Not bad. You can even restore it if need be...

VC
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

A. Fig Lee wrote:
f_evgeny wrote:2. - Думаю можно проверить из программы

Как?
Файл постоянно открыт и периодически туда пишется инфо.
Пока в голову пришло ... нет, ничего не пришло... Разве периодически проверять файл в другом треде..

Ну да, только так, можно читать директорию, можно пробовать открыть файл из другого процесса. Но я такого не делал, это то, что приходит мне в голову.
Да, кстати, если информация пишется периодически, можно так же периодически его закрывать/открывать.
User avatar
VladDod
Уже с Приветом
Posts: 56205
Joined: 06 May 2001 09:01

Post by VladDod »

A. Fig Lee wrote:
f_evgeny wrote:2. - Думаю можно проверить из программы

Как?
Файл постоянно открыт и периодически туда пишется инфо.
Пока в голову пришло ... нет, ничего не пришло... Разве периодически проверять файл в другом треде..

Может просто следит за указателем позиции в фаиле?
А если фаил открыть как "for append" он разве не вернет ошибку при попытке записи в несуществующий уже фаил?
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
VladDod
Уже с Приветом
Posts: 56205
Joined: 06 May 2001 09:01

Post by VladDod »

Нда ... фигня получается. :pain1: Надо закрывать-открывать файл.
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

VladDod wrote:
A. Fig Lee wrote:
f_evgeny wrote:2. - Думаю можно проверить из программы

Как?
Файл постоянно открыт и периодически туда пишется инфо.
Пока в голову пришло ... нет, ничего не пришло... Разве периодически проверять файл в другом треде..

Может просто следит за указателем позиции в фаиле?
А если фаил открыть как "for append" он разве не вернет ошибку при попытке записи в несуществующий уже фаил?

Не вернет, для процесса открытый файл так и остается существующим до его (процесса), конца работы. Это по генеральной Юниксовой линии так. И так и должно быть!
User avatar
VladDod
Уже с Приветом
Posts: 56205
Joined: 06 May 2001 09:01

Post by VladDod »

f_evgeny wrote:Не вернет, для процесса открытый файл так и остается существующим до его (процесса), конца работы. Это по генеральной Юниксовой линии так. И так и должно быть!

Аха ... проверил уже. Ну для "реал-тайм" полезно таки держать файлы закрытыми основное время. (почему, вероятно, и не сталкивался с такой проблемой).
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

VladDod wrote:Аха ... проверил уже. Ну для "реал-тайм" полезно таки держать файлы закрытыми основное время. (почему, вероятно, и не сталкивался с такой проблемой).

какой же ето реалтайм? Если порядка 100 записей в секунду. 100 раз открывать-закрывать?

Как бы директори ентри локнуть чтоб нельзя тида писать было. Нет ли такой файл систем?
Верить нельзя никому - даже себе. Мне - можно!
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

f_evgeny wrote:Не вернет, для процесса открытый файл так и остается существующим до его (процесса), конца работы. Это по генеральной Юниксовой линии так. И так и должно быть!

А в чём причина, почему это так однозначно правильно?

P.S. Отдельный вопрос-подколка - а почему Вы специально выбираете фразеологию Съездов КПСС? :)
Cheers
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

A. Fig Lee wrote:Как бы директори ентри локнуть чтоб нельзя тида писать было. Нет ли такой файл систем?

А в чём состоит исходная задача решение которой упёрлось в базовые принципы операционной системы? Может её как-то иначе можно решать - без смены файловых систем?
Cheers
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Наверное, я плохой рассказчик - чтото никто не может понять что надо.
Есть файл, который открывается программой и туда постоянно пишется инфо.
Если удалить файл после того как программа открыла файл, программа пишущая в файл понятия об етом иметь не будет, а хотелось бы. Или чтоб его удалить было нельзя.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

A. Fig Lee wrote:Есть файл, который открывается программой и туда постоянно пишется инфо. Если удалить файл после того как программа открыла файл, программа пишущая в файл понятия об етом иметь не будет, а хотелось бы. Или чтоб его удалить было нельзя.

А почему уже упоминавшееся решение c chmod не подходит? Также можно перед закрытием файла убедиться, что его имя в директории не изменилось (я, правда, не знаю, есть ли в POSIX API, который позволяет это делать по открытому хендлу.) Если же оно изменилось, то произвести какие-то осмысленные действия. Например, попробовать переименовать его в исходное имя.
Cheers
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

A. Fig Lee wrote:Наверное, я плохой рассказчик - чтото никто не может понять что надо.
Есть файл, который открывается программой и туда постоянно пишется инфо.
Если удалить файл после того как программа открыла файл, программа пишущая в файл понятия об етом иметь не будет, а хотелось бы. Или чтоб его удалить было нельзя.


You can just backup the file name and then attempt to restore it on the program completion:

Code: Select all

#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

int main() {
  if (link("a.dat", "a.dat.bck") == -1)
    {printf("Could not create a backup name: %d\n", errno); exit(2);}
  sleep(10);
  if (rename("a.dat.bck", "a.dat") == -1) {
    if (errno == EEXIST) unlink("a.dat.bck");
    else printf("Error renaming : %d\n", errno);
  }
}

oracle@staging1>gcc -o b b.c
ls - l > a.dat
oracle@staging1>./b &
[1] 9959
oracle@staging1>rm a.dat
[1]+  Done                    ./b
oracle@staging1>ls -l a.dat
-rw-r--r--   1 oracle   dba          562 May  9 19:05 a.dat


VC
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

tengiz wrote:
A. Fig Lee wrote:Есть файл, который открывается программой и туда постоянно пишется инфо. Если удалить файл после того как программа открыла файл, программа пишущая в файл понятия об етом иметь не будет, а хотелось бы. Или чтоб его удалить было нельзя.

А почему уже упоминавшееся решение c chmod не подходит? Также можно перед закрытием файла убедиться, что его имя в директории не изменилось (я, правда, не знаю, есть ли в POSIX API, который позволяет это делать по открытому хендлу.) Если же оно изменилось, то произвести какие-то осмысленные действия. Например, попробовать переименовать его в исходное имя.


'chmod' protects the file contents but it does not protect the file name which is a separate entity (a directory entry).

VC
User avatar
Pink Panther
Уже с Приветом
Posts: 3811
Joined: 14 Oct 2001 09:01

Post by Pink Panther »

A. Fig Lee wrote:Прекрасно. Вернемся к оригинальному вопросу - как выловить что файл был "rm-ed"?
Единственно приходит в голову - периодически чекать директори ентри.


Какой кошмар, ну прямо каменный век какой-то! :wink: А вот в Windows :lol: :umnik1: есть замечательная фунция ReadDirectoryChangesW, которая сама все изменения рапортует. В юниксе наверняка есть что-то подобное.

Return to “Вопросы и новости IT”