Форум программистов, компьютерный форум, киберфорум
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 73
1

Мониторинг файла

12.04.2013, 23:03. Просмотров 1252. Ответов 5
Метки нет (Все метки)

Добрый день.

Может кто подскажет - есть контроллер под Linux ARM
У него одна из лап заведена на шину прерывания.
Состоянию этой лапы соответствует файл /sys/class/gpio/gpio29/value, в котором содержится либо 0, либо 1.

Задача следующая - в основном цикле программы находится функция select, которая обрабатывает кучку сокетов. Хотелось бы в этот же селект добавить и мониторинг файла.

Сначала мне подсказали, что можно просто сделать open этого файла, добавить его дескриптор в множество exceptfds select'а и при изменении файла этот дескриптор будет ISSET.

Но чтото ничего из этого не получилось... Файл можно сколько угодно изменять и даже удалять, select все равно возвращает 0 по таймауту.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2013, 23:03
Ответы с готовыми решениями:

Мониторинг папки
написал демона который должен в два потока мониторить две заданые с консоли папки при компиляции...

Мониторинг файла?
Здравствуйте, возникла некоторая проблема в создание программы которая бы выполняла некоторые...

Постоянный мониторинг файла
Добрый день. С php мало знаком, потому пишу на коленке. Целью является при возникновении...

Мониторинг наличия файла
Здравствуйте! необходимо организовать консольное приложение, которое осуществляет мониторинг...

5
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
13.04.2013, 12:30 2
Цитата Сообщение от Dizark Посмотреть сообщение
Сначала мне подсказали, что можно просто сделать open этого файла, добавить его дескриптор в множество exceptfds select'а и при изменении файла этот дескриптор будет ISSET
в общем случае для псевдофс polll select inotify - все бесполезно

но в данном случае можно если линия gpio может быть использована как источник прерывания нужно в файл /sys/class/gpio/gpioX/edge явно прописать этот момент
C
1
2
3
4
5
6
7
8
9
static const struct {
        const char *name;
        unsigned long flags;
} trigger_types[] = {
        { "none",    0 }, Х
        { "falling", BIT(FLAG_TRIG_FALL) },
        { "rising",  BIT(FLAG_TRIG_RISE) },
        { "both",    BIT(FLAG_TRIG_FALL) | BIT(FLAG_TRIG_RISE) },
};
будет установлен обработчик прерывания который вызовет sysfs_notify_dirent который разбудит poll-ящий процесс А без этого можно полить и селектить бесконечно
1
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 73
15.04.2013, 13:04  [ТС] 3
Все равно не получается...

В файл /../gpio/gpio29/edge заношу значение falling
/../gpio/gpio29/direction -- in
/../gpio/gpio29/active_low -- 0
/../gpio/gpio29/uevent -- пустой файл

Пытаюсь смотреть за изменениями через inotify (смотрю за всей директорией). Взято из примера работы с inotify
Код следующий:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/inotify.h>
 
#define INT_GPIO_FILE       "/sys/class/gpio/gpio29"
#define EVENT_SIZE          (sizeof (struct inotify_event))
#define EVENT_BUF_LEN       (1024 * (EVENT_SIZE + 16))
 
 
int main (void)
{
    int length, i = 0;
    int fd;
    int wd;
    char buffer[EVENT_BUF_LEN];
 
    // Create inotify instance
    fd = inotify_init ();
    if (fd == -1)
    {
        perror ("Inotify create");
        exit (1);
    }
 
    // adding directory to watching
    wd = inotify_add_watch (fd, INT_GPIO_FILE, IN_ALL_EVENTS);
    length = read (fd, buffer, EVENT_BUF_LEN);
 
    if (length < 0) perror ("read");
 
    while (i < length)
    {
        struct inotify_event *event = (struct inotify_event*)&buffer[i];
        if (event->len)
        {
            printf ("Something hapenns.\n");
        }
        i += EVENT_SIZE + event->len;
    }
 
    inotify_rm_watch (fd, wd);
    close (fd);
 
    return 0;
}
Когда я через команду echo x > ... меняю содержимое файлов в папке /../gpio29 все прекрасно отслеживается. А вот когда меняется уровень на шине - фигушки.

Через watch -n 1 cat /sys/class/gpio/gpio29/value видно, что уровень на шине таки меняется

Может еще что-то где-то надо включить, типа разрешение прерываний?
0
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
15.04.2013, 15:16 4
Цитата Сообщение от Dizark Посмотреть сообщение
Все равно не получается...
В файл /../gpio/gpio29/edge заношу значение falling
/../gpio/gpio29/direction -- in
/../gpio/gpio29/active_low -- 0
/../gpio/gpio29/uevent -- пустой файл
Код покажите. Я не понимаю что тут написано. Должно быть так:
В файл /../gpio/gpio29/edge заношу значение falling
Делаю poll на value, value меняется - poll возвращает управление в программу
***
Цитата Сообщение от Dizark Посмотреть сообщение
Когда я через команду echo x > ... меняю содержимое файлов в папке /../gpio29 все прекрасно отслеживается. А вот когда меняется уровень на шине - фигушки.
echo использует sys_write, который вызывает fsnotify_modify. При записи из юзерспейса poll, select и inotify работать будут. inotify слишком громоздкий для этой задачи, достаточно poll'a

Добавлено через 2 минуты
Цитата Сообщение от Dizark Посмотреть сообщение
Может еще что-то где-то надо включить, типа разрешение прерываний?
запись в edge как раз и устанавливает обработчик. Если эта gpio-линия может использоваться как источник прерываний
0
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 73
15.04.2013, 16:20  [ТС] 5
Кода конфигурирования ноги GPIO нет.
Я из консоли пишу:
echo 29 > /sys/class/gpio/export
echo 'in' > /sys/class/gpio/gpio29/direction
echo 0 > /sys/class/gpio/gpio29/active_low
echo 'falling' > /sys/class/gpio/gpio29/edge

После чего запускаю программу, код которой представлен постом выше.
Если я сам из консоли меняю файлы в директории /sys/class/gpio/gpio29 - то inotify срабатывает и сообщает, что что-то случилось
Когда файл /sys/class/gpio/gpio29/value меняется из-за того, что кто-то передернул шину, к которой этот GPIO подключен - ничего не происходит.
0
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
15.04.2013, 17:47 6
Цитата Сообщение от Dizark Посмотреть сообщение
Когда файл /sys/class/gpio/gpio29/value меняется из-за того, что кто-то передернул шину, к которой этот GPIO подключен - ничего не происходит.
обработчик прерывания
C
1
2
3
4
5
6
7
static irqreturn_t gpio_sysfs_irq(int irq, void *priv)
{
        struct sysfs_dirent     *value_sd = priv;
 
        sysfs_notify_dirent(value_sd);
        return IRQ_HANDLED;
}
sysfs_notify_dirent даёт зелёный свет блокированным poll'ом и select'ом процессам. Больше он ничего не делает. Судя по первому сообщению программа с селектом у вас уже есть. Ну так запускайте её
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2013, 17:47

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

Мониторинг изменений текстового файла
Добры день. Помогите с кодом, необходимо проверять на изменение теста файл(txt) с интервалом 1 сек...

Мониторинг .bat файла Zabbix
Всем привет. Подскажите, как можно организовать в заббиксе мониторинг количества запущенных...

Реализовать мониторинг модификаций файла
Добрый день. Нужна помощь при работе с файлами. Суть в следующем - есть текстовый файл. При...

Оптимальный мониторинг изменения файла
Здравствуйте! Сторонняя программа записывает информацию в txt файл, как можно сделать, что как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.