Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Как узнать, к какому файлу обращается прога?


Автор: FreeNUX 2.7.2005, 00:23
Сабж.

Автор: Ni@m 2.7.2005, 02:25
я не понял что тебе надо, но попробуй man lsof.
Эта тулза показывает открытые файлы и кем они заюзаны.

Автор: FreeNUX 2.7.2005, 02:47
Конкретнее, такой пример - как узнать, какой файл открыт на чтение xmms'om в данный момент времени?

Автор: Ni@m 2.7.2005, 04:29
lsof | grep xmms

Автор: Mayk 2.7.2005, 06:23
Можно еще посмотреть в /proc/`getpid()`/fd.
Там симлинки на открытые файлы.

Автор: FreeNUX 2.7.2005, 16:01
Ладно, ещё конкретнее. Как отследить, какой музыкальный файл открыт xmms'om на чтение.

Mayk
К сожалению во фряхе (FreeBSD 5.3) /proc пуст.

Ni@m
Я просил объяснить, как это реализовать программно (хотябы кратко описать алгоритм).

Автор: Ni@m 2.7.2005, 17:49
Если честно, то не знаю. Есть 2 выхода - покопать исходники lsof или я думаю что у самого xmms как-то узнать можно. Я сам покопаю исходлики lsof, может позже подскажу.

Автор: FreeNUX 2.7.2005, 19:49
Ni@m
Буду благодарен. Может быть я плохо смотрел, но lsof не видит какой музыкальный файл открыт на чтение xmms'ом.

Автор: comcon1 3.7.2005, 10:57
А у меня очень даже видит. Только что проверял. Правда среди открытых дескрипторов у XMMS-а еще куча. Мож у тебе не те параметры стоят.

А насчет програмно, так вот: у процесса есть две структуры -proc и user. У user есть ссылка на таблицу открытых дескрипторов - u_ofile. Покопай в этой области. По открытому дескриптору системной функцией stat можно посмотреть инфо о устройстве (в твоем случае - файле), которому этот дескриптор соответствует.

Автор: FreeNUX 3.7.2005, 13:45
comcon1
Спасибо за совет.

Автор: Ni@m 3.7.2005, 17:53
Это все хорошо, но stat работает с определеннім файлом. Не годится, если прийдется перечесать весь плейлист.

Автор: achmed 4.7.2005, 10:37
strace

Автор: Ni@m 4.7.2005, 17:40
Уф. Замучался уже клпать те злые исходники. Но кое-что нарыл. Можно пользоваться либами lsof.

У него в описании сказано =
Цитата
Show us what files are opened by processes whose names starts by bash.
lsof -c bash


И вот что я нашел в main()
Код

        case 'c':
        if (GOp == '+') {
            if (!GOv || (*GOv == '-') || (*GOv == '+')
            ||  !isdigit((int)*GOv))
            {
            (void) fprintf(stderr,
                "%s: +c not followed by width number\n", Pn);
            err = 1;
            if (GOv) {
                GOx1 = GObk[0];
                GOx2 = GObk[1];
            }
            } else
            CmdLim = atoi(GOv);
            break;
        }
        if (GOv && (*GOv == '/')) {
            if (enter_cmd_rx(GOv))
            err = 1;
        } else {
            if (enter_str_lst("-c", GOv, &Cmdl))
            err = 1;
        }
        break;

После некоторых соображения, я решил что в данном случае пользуется функция enter_str_lst, которая принимает первым праметром "-c", вторым - "xmms" к примеры - а третьим массив структур, содержащих строки - состоит из :
Код

struct str_lst {
    char *str;            /* string */
    int len;            /* string length */
    int f;                /* selected string find state */
    struct str_lst *next;        /* next list entry */
};


Я думаю, если подключить нужные либы(я сейчас не имею возможности сказать, но можно посмотреть ldd /usr/bin/lsof) и подключить lsof.h,proto.h(думаю этих хватит).
Может быть, что есть нормальный мануал по использованию функций из этого пакета, но я не нашел =(.
Это все конечно коряво и непроверенно, но тоже имеет право на жизнь. Я как получу возможность, так сразу проверю!
Если будешь пробовать, сообщи о результатах.

Автор: FreeNUX 10.7.2005, 01:44
Ni@m
Спасибо за беспокойство, но боюсь в данном случае lsof не подойдёт, так уж сложилось, что вся моя музыка лежит на разделе с фс NTFS, а lsof , по поводу открытого музыкального файла, выдаёт - unknown file system type: ntfs.

Автор: Ni@m 17.7.2005, 20:33
Да ничего. Хоть сам немного растормошился =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)