Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Проверить что файл открыт кем-то другим  (Прочитано 3910 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн danilsl

  • Автор темы
  • Участник
  • *
  • Сообщений: 170
    • Просмотр профиля
Всем привет.
Существует такая задача: если вставлена флешка, то из указанной папки слить на неё все avi файлы. Проблема возникла на том, что эта софтина благополучно щлёпает так же и тот файл, который в данный момент пишется. А как можно проверить не открыт ли файл в другом приложении, перед тем как его перемещать?
Всем заранее спасибо

Бди!

  • Гость
Re: Проверить что файл открыт кем-то другим
« Ответ #1 : 13 Сентября 2011, 11:55:05 »
Может я и туплю,
но записываться на флешку
(или удаляться)
файл бутет тогда,когда ты эту флешку
извлекаешь.

Оффлайн danilsl

  • Автор темы
  • Участник
  • *
  • Сообщений: 170
    • Просмотр профиля
Re: Проверить что файл открыт кем-то другим
« Ответ #2 : 13 Сентября 2011, 12:17:42 »
Может я и туплю,
но записываться на флешку
(или удаляться)
файл бутет тогда,когда ты эту флешку
извлекаешь.
нет, именно в момент вставки. Программу копирования запускает udev. Прога, которая клепает авишки вообще не в курсе ни про флешки, ни про копирование. Если место заканчивается она просто убивает самые старые файлы. Последний файл она всегда держит открытым. И лично для меня стало новостью, что другая прога может не только скопировать этот открытый файл, но ещё и грохнуть его. Мне представлялось, что на открытом файле я должен был вывалиться на try{}catch(...){} и тупо на него забить. Однако ошибки не вываливается

Пользователь решил продолжить мысль 13 Сентября 2011, 12:21:10:
кстати монтирует а потом размонтирует флешку тоже прога копирования. И на данный момент единственный способ понять что копирование завершено - светодиод флешки. В перспективе же планируется festival, но это уже не из той оперы. Сейчас нужно просто проверить кто кроме меня работает с файлом, точнее даже работает ли вообще с этим файлом кто-то кроме меня.
« Последнее редактирование: 13 Сентября 2011, 12:21:10 от danilsl »

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
Re: Проверить что файл открыт кем-то другим
« Ответ #3 : 13 Сентября 2011, 12:46:05 »
lsof? сдаётся мне, есть более архитектурно правильное решение.

> И на данный момент единственный способ понять что копирование завершено - светодиод флешки. В перспективе же планируется festival
Ну прям всё или ничего. Почему нельзя выдавать окошко через zenity?

andrey_p

  • Гость
Re: Проверить что файл открыт кем-то другим
« Ответ #4 : 13 Сентября 2011, 14:30:18 »
Почем? lsof /media/* по-моему нормально. Или fuser /media.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Проверить что файл открыт кем-то другим
« Ответ #5 : 14 Сентября 2011, 19:39:34 »
Всем привет.
Существует такая задача: если вставлена флешка, то из указанной папки слить на неё все avi файлы.
Автоматически?

Проблема возникла на том, что эта софтина благополучно щлёпает так же и тот файл, который в данный момент пишется. А как можно проверить не открыт ли файл в другом приложении, перед тем как его перемещать?
Всем заранее спасибо
lsof уже советовали.

Что за софтина, это Вы ее пишете?
А avi кто пишет? Тоже Ваша софтина? Есть ли исходники и возможность перекомпилировать?

Могу порекомендовать file lock (см. man fcntl, раздел Advisory Locking)
Т.е. при записи авишника ставить на него замок, а при копировании - проверять, если замок есть, не копировать.

У меня так демон определяет, что уже запущен, даже если в прошлый раз грохнулся и pid-файл не удалил.

Надо только иметь в виду, что замки в юниксах кооперативные, т.е., одна программа должна явно поставить замок на файл, а другая - явно проверить его наличие.
Если программа ничего не знает ни про какие замки или игнорирует их, то при наличии прав ничто не помешает ей открыть файл, удалить его или что-то в него написать.
« Последнее редактирование: 14 Сентября 2011, 19:45:28 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн danilsl

  • Автор темы
  • Участник
  • *
  • Сообщений: 170
    • Просмотр профиля
Re: Проверить что файл открыт кем-то другим
« Ответ #6 : 15 Сентября 2011, 00:30:16 »
lsof? сдаётся мне, есть более архитектурно правильное решение.

> И на данный момент единственный способ понять что копирование завершено - светодиод флешки. В перспективе же планируется festival
Ну прям всё или ничего. Почему нельзя выдавать окошко через zenity?
lsof сквозь system() вызывать нужно, а мне из спортивного интереса хочется через api сделать.
Окошко выдавать некуда ;) монитора нет, клавы, мыши и сети тоже

Пользователь решил продолжить мысль 15 Сентября 2011, 00:52:59:
o
Автоматически?
Да
Что за софтина, это Вы ее пишете?
А avi кто пишет?
Софтину для копирования пишу я. Исходники есть и от второй, но её трогать не хочется, знаете поговорку работает - не трож.
Насчёт lsof. Честно говоря это была моя первая мысль. Но вызывать её придётся в виде lsof | grep filename. И всё это скормить в system(). Ну а та честно вызовет lsof и честно скормит ей argv[1]=|, argv[2]=grep, argv[3]=filename. И ничем хорошим это не закончится.
И lsof гдето берёт эту инфу, значит должно быть api
« Последнее редактирование: 15 Сентября 2011, 00:52:59 от danilsl »

andrey_p

  • Гость
Re: Проверить что файл открыт кем-то другим
« Ответ #7 : 15 Сентября 2011, 04:58:16 »
А в чем проблема, скачал исходники и разбирайся. В любом случае уметь читать исходники полезная в жизни штука.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Проверить что файл открыт кем-то другим
« Ответ #8 : 15 Сентября 2011, 14:55:11 »
Если есть исходники программы, создающей avi, можно проверить, а вдруг она уже ставит замки на файлы.

lsof, если не ошибаюсь, работает через procfs

А вот, кстати, еще один способ получения информации, довольно удобный.
Получить pid процесса, создающего авишники, и посмотреть в /proc/12341/fd или /proc/12341/fdinfo, где 12341 - pid, какие дескрипторы открыты.

Вот, например, я нашел информацию о плеере:

(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 15 Сентября 2011, 15:51:56:
И лично для меня стало новостью, что другая прога может не только скопировать этот открытый файл, но ещё и грохнуть его. Мне представлялось, что на открытом файле я должен был вывалиться на try{}catch(...){} и тупо на него забить.
Да вот еще!
Это не Windows, root должен быть в состоянии сделать все - в том числе и удалить любой файл.
А иначе это угроза безопасности.

Пользователь решил продолжить мысль 15 Сентября 2011, 19:26:50:
Не, все-таки, дописать пару вызовов fcntl в код, создающий авишники, гораздо проще, чем сканировать /procfs.
Эти вызовы ничего не испортят.
И работать будет надежнее, т.к. это будет информация из первых рук.
« Последнее редактирование: 15 Сентября 2011, 19:26:50 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн danilsl

  • Автор темы
  • Участник
  • *
  • Сообщений: 170
    • Просмотр профиля
Re: Проверить что файл открыт кем-то другим
« Ответ #9 : 16 Сентября 2011, 19:04:22 »
Исходники есть, я не проверяя скажу, что специально там никто ничего не ставит. А запись авишек через OpenCV идёт, а там уже даже и не знаю, как-то даже и ковырять не хочу.
А вот за /proc спасибо. И как я сам не дотукал? Ведь знаю же что там лежит...

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Проверить что файл открыт кем-то другим
« Ответ #10 : 19 Сентября 2011, 12:00:10 »
Там есть CvVideoWriter.
Ничего сложного.
Объявить переменную типа struct flock, далее после open и перед close - вызов fcntl(fd, F_SETLK, &flock)
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.024 секунд. Запросов: 22.