psl
Гость
|
|
« : 09-12-2005 07:33 » |
|
Как узнать, сколько дескрипторов ссылается на файл (без привелегий root).
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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
|
|
« Ответ #2 : 09-12-2005 17:44 » |
|
RXL,
мне кажется, что psl интересует именно количество открытий заданного файла, а не число жёстких ссылок на файл.
Не знаю, как это сделать без рутовых прав, но знаю, как сделать с рутовыми: Если имя файла находится в переменной окружения FNAME, то в командной строке ls -l /proc/*/fd | grep --fixed-string "$FNAME" | wc -l
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #3 : 09-12-2005 17:59 » |
|
Вот такие вот вопросы, что приходится гадать...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
psl
Гость
|
|
« Ответ #4 : 13-12-2005 06:44 » |
|
Уфф... Я открываю файл fd = open(...); Могу ли я при повторном fd = open(...); как-нибудь узнать, что файл мною уже открыт. Такая информация в файловой системе есть - вопрос как ее получить без привелегий рута.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #5 : 13-12-2005 09:33 » |
|
Если это твоя программа, то ты и должен знать, открыт ли файл. Я, обычно, для этого делаю переменную, в которую помещая номер открытого файла, и, если надо роверить, есть ли файл, делаю простое if(fd > 0). Переменную надо первоначально проинициализировать, установив в -1. Так же при закрытии файла надо делать fd=-1. Стоит так же помнить, что дескриптор открытого файла хранит в себе текущую позицию чтения-записи. Если ты будешь работать с файлом в нескольких местах программы, то помни о возможности такого конфликта. Если пользоваться потоковыми ф-иями libc, то можно переоткрывать файл по имени: freopen().
Этого тебе достаточно?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
npak
|
|
« Ответ #6 : 13-12-2005 09:34 » |
|
В файловой системе такой информации нет, эта информация хранится в ядре, в структуре данных "процесс".
Для своего процесса храни список открытых файлов, пользуйся своими средствами. Или посмотри среди ссылок в файловой системе /proc/<id_твоего_процесса>/fd/*
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #7 : 13-12-2005 09:53 » |
|
Коль, таким же макаром можно еще перебрать все дескрипторы и протестить их на достоверность через fstat(), но имя файла там нет. Как финт ушами: сделать stat() и сравнивать inode с открытыми файлами. Не проверял.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #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
|
|
« Ответ #10 : 13-12-2005 12:49 » |
|
Никак. Не придумывай себе проблем. Программа пишется под ОС, а не наоборот.
Хотя, почитай про блокировку файла.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
npak
|
|
« Ответ #11 : 13-12-2005 13:10 » |
|
Блокировки файла защищают только от доступа из разных процессов. Сам процесс может открывать файл со своими блокировками сколько угодно. По крайней мере это так для flock
|
|
|
Записан
|
|
|
|
psl
Гость
|
|
« Ответ #12 : 13-12-2005 13:46 » |
|
>Никак. Не придумывай себе проблем. Программа пишется под ОС, а не наоборот. Вот именно. Поэтому хочется использовать механизмы ОС по максимуму. Какие могут быть в этом случае проблемы?
Я прочитал всю доступную мне документацию, ответа не нашел - поэтому и задал вопрос,
> Хотя, почитай про блокировку файла. а про блокировки в данном случае хорошо сказал npak.
В любом случае всем большое спасибо за ответы.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #13 : 13-12-2005 13:48 » |
|
Логично - я что-то не подумал.
Если нужно что-то нестандартное, то надо писать свою оболочку для работы с файлами - там любой контроль можно организовать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #14 : 13-12-2005 13:49 » |
|
Какие проблемы? - Так ты же сам их себе создаешь. А зачем тебе такие сложности с файлами? Я думаю, с этого надо начинать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
psl
Гость
|
|
« Ответ #15 : 14-12-2005 06:25 » |
|
>Какие проблемы? - Так ты же сам их себе создаешь. >А зачем тебе такие сложности с файлами? Я думаю, с этого надо начинать.
Я _не изобретаю_ велосипед - я ездить на нем учусь!:)))
|
|
|
Записан
|
|
|
|
|