Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сколько дескрипторов у файла?  (Прочитано 18112 раз)
0 Пользователей и 1 Гость смотрят эту тему.
psl
Гость
« : 09-12-2005 07:33 » 

Как узнать, сколько дескрипторов ссылается на файл (без привелегий root).
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 09-12-2005 16:58 » 

[rxl@mail temp]$ touch a
[rxl@mail temp]$ ls -l
итого 0
-rw-rw-r--  1 rxl rxl 0 Дек  9 19:56 a
[rxl@mail temp]$ ln a b
[rxl@mail temp]$ ls -l
итого 0
-rw-rw-r--  2 rxl rxl 0 Дек  9 19:56 a
-rw-rw-r--  2 rxl rxl 0 Дек  9 19:56 b
[rxl@mail temp]$


Правильнее будет сказать, не сколько "дескрипторов у файла", а сколько ссылок на inode есть. Пока число ссылок не дойдет до нуля файл существует.
« Последнее редактирование: 09-12-2005 17:00 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 09-12-2005 17:44 » 

RXL,

мне кажется, что psl интересует именно количество открытий заданного файла, а не число жёстких ссылок на файл.

Не знаю, как это сделать без рутовых прав, но знаю, как сделать с рутовыми:
Если имя файла находится в переменной окружения FNAME, то в командной строке
ls -l /proc/*/fd | grep --fixed-string "$FNAME" | wc -l
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 09-12-2005 17:59 » 

Вот такие вот вопросы, что приходится гадать...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
psl
Гость
« Ответ #4 : 13-12-2005 06:44 » 

Уфф...
Я открываю файл fd = open(...);
Могу ли я при повторном fd = open(...); как-нибудь узнать, что файл мною уже открыт. Такая информация в файловой системе есть - вопрос как ее получить без привелегий рута.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 13-12-2005 09:33 » 

Если это твоя программа, то ты и должен знать, открыт ли файл. Я, обычно, для этого делаю переменную, в которую помещая номер открытого файла, и, если надо роверить, есть ли файл, делаю простое if(fd > 0). Переменную надо первоначально проинициализировать, установив в  -1. Так же при закрытии файла надо делать fd=-1.
Стоит так же помнить, что дескриптор открытого файла хранит в себе текущую позицию чтения-записи. Если ты будешь работать с файлом в нескольких местах программы, то помни о возможности такого конфликта.
Если пользоваться потоковыми ф-иями libc, то можно переоткрывать файл по имени: freopen().

Этого тебе достаточно?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 13-12-2005 09:34 » 

В файловой системе такой информации нет, эта информация хранится в ядре, в структуре данных "процесс".

Для своего процесса храни список открытых файлов, пользуйся своими средствами.
Или посмотри среди ссылок в файловой системе /proc/<id_твоего_процесса>/fd/*
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 13-12-2005 09:53 » 

Коль, таким же макаром можно еще перебрать все дескрипторы и протестить их на достоверность через fstat(), но имя файла там нет.
Как финт ушами: сделать stat() и сравнивать inode с открытыми файлами. Не проверял.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 13-12-2005 10:11 » 

Код:
#include <sys/stat.h>
#include <errno.h>

int get_opened_file(char * filename)
{
    int i;
    struct stat  st_fn, st_fd;

    if (stat(filename, &st_fn))
        return -1;
    for (i = 0; i < FD_SETSIZE; i++)
    {
        if (fstat(i, &st_fd))
            continue;
        if (st_fn.st_dev == st_fd.st_dev && st_fn.st_ino == st_fd.st_ino)
            return i;
    }
    errno = ENOENT;
    return -1;
}
Тут доки на ф-ии: http://docs.netive.ru/susv3/functions/contents.html
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
psl
Гость
« Ответ #9 : 13-12-2005 12:08 » 

А можно как-нибудь сделать так, чтобы ядро не позволяло открыть больше одного дескриптора для одного файла, не блокируя при этом другой/текущий процесс?

Т.е.
...
fd = open(.."my.file"...); 
...
и чтобы при последующем fd = open(.."my.file"...); возвращался fd = -1; пока я не закрою дескриптор close(fd)?

Поиск в любом виде я реализовать могу, но мне интересно сделать так, чтобы использовались механизмы ядра/фс.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 13-12-2005 12:49 » 

Никак. Не придумывай себе проблем. Программа пишется под ОС, а не наоборот.

Хотя, почитай про блокировку файла.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 13-12-2005 13:10 » 

Блокировки файла защищают только от доступа из разных процессов.  Сам процесс может открывать файл со своими блокировками сколько угодно.  По крайней мере это так для flock
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
psl
Гость
« Ответ #12 : 13-12-2005 13:46 » 

>Никак. Не придумывай себе проблем. Программа пишется под ОС, а не наоборот.
Вот именно. Поэтому хочется использовать механизмы ОС по максимуму. Какие могут быть в этом случае проблемы?

Я прочитал всю доступную мне документацию, ответа не нашел - поэтому и задал вопрос,

> Хотя, почитай про блокировку файла.
а про блокировки в данном случае хорошо сказал npak.

В любом случае всем большое спасибо за ответы.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 13-12-2005 13:48 » 

Логично - я что-то не подумал.

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 13-12-2005 13:49 » 

Какие проблемы? - Так ты же сам их себе создаешь.
А зачем тебе такие сложности с файлами? Я думаю, с этого надо начинать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
psl
Гость
« Ответ #15 : 14-12-2005 06:25 » 

>Какие проблемы? - Так ты же сам их себе создаешь.
>А зачем тебе такие сложности с файлами? Я думаю, с этого надо начинать.

Я _не изобретаю_ велосипед - я ездить на нем учусь!:)))
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines