Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Получение имени съемного накопителя

20.12.2018, 12:01. Показов 2785. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня всем! Не знал в каком разделе написать. Знаний в области Линукса мало...
Мне необходимо написать простую программу, начал на Сишарпе. Для отлова событий изменения ядра использую udev API. Вызываю сишные методы.
Я вот не пойму, правильно - ли я выбрал направление с работой через udev? У меня с горем пополам получилось получить событие action (add/remove), но как получить имя я не знаю. Флешка у меня распознается как dev/sda, вторая как /dev/sdb
Путь в syspath = "/sys/devices/soc0/soc/2100000.aips-bus/2184000.usb/ci_hdrc.0"/ Все это дело автомонтируется в /media/usb0-usb7. Ломаю голову, как же получить имя диска?
Нашел простой пример, но я так понимаю что он не даст мне имя по типу /dev/sda или /mount/usb
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
    fd_set fds;
        struct timeval tv;
        int ret;
        
        FD_ZERO(&fds);
        FD_SET(fd, &fds);
        tv.tv_sec = 0;
        tv.tv_usec = 0;
        
        ret = select(fd+1, &fds, NULL, NULL, &tv);
        
        /* Check if our file descriptor has received data. */
        if (ret > 0 && FD_ISSET(fd, &fds)) {
            printf("\nselect() says there should be data\n");
            
            /* Make the call to receive the device.
               select() ensured that this will not block. */
            dev = udev_monitor_receive_device(mon);
            if (dev) {
                printf("Got Device\n");
                printf("   Node: %s\n", udev_device_get_devnode(dev));
                printf("   Subsystem: %s\n", udev_device_get_subsystem(dev));
                printf("   Devtype: %s\n", udev_device_get_devtype(dev));
 
                printf("   Action: %s\n", udev_device_get_action(dev));
                udev_device_unref(dev);
            }
            else {
                printf("No Device from receive_device(). An error occured.\n");
            }
Для получения событий изменения я дергаю функцию udev_device_get_action(...)
В общем, запутался. Прошу помощи именно в теории, как правильно сделать и какой инструмент ОС задействовать.
ПС: Сделал так же вариант хардкода, когда имя внешнего накопителя константное, так как использую только 1 порт usb (/media/usb1), но вдруг с системой что станет и имя изменится...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2018, 12:01
Ответы с готовыми решениями:

Определение буквы съемного диска(флэшки) по имени или серийному номеру (без WMIC). Простой способ
Интересовался данной темой и что-то в гугле не нашел (мож забанили). Сегодня осенило: Поиск по имени: set...

Получение имени панели
Всем привет. У меня есть список панелей List<Panel> Panel_My = new List<Panel>(); Добавление панелей происходит Panel_My.Add(new...

Получение имени пользователя пк по ip
Есть ли возможность узнать текущее имя пользователя пк по IP, например 178.1##.5.## - Дима?...

45
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
20.12.2018, 12:41
Цитата Сообщение от Jman Посмотреть сообщение
printf(" Node: %s\n", udev_device_get_devnode(dev));
А это разве не оно?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
20.12.2018, 12:46  [ТС]
udev_device_get_devnode
Да, я то же так подумал, но форум не дал скорректировать пост.
По идее devnode это и есть имя устройства?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
20.12.2018, 12:51
Цитата Сообщение от Jman Посмотреть сообщение
По идее devnode это и есть имя устройства?
Да.
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
20.12.2018, 12:58  [ТС]
Я получаю имя /dev/sda и тд... Это то что нужно...
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 13:42  [ТС]
Вернусь к данному вопросу. На данный момент все работает. Но меня терзают смутные сомнения по данному примеру! Если смотреть исходник, то опрос устройств происходит в вечном цикле с задержкой
C
1
usleep(250*1000);
Это по идее 250 мс. Блин, это что получается. Прога бомбардирует запросами каждые 250 мс ОС?
И как она выходит из бесконечного цикла?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 14:04
Ответы Да и никак
Это же просто пример, печатая точку они показывают "все работает - вставь устройство"...
Вопрос не задан, но предполагаю, что вам нужен NULL последним параметром у select(), ну или просто не нулевой таймаут.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 14:06  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
что вам нужен NULL последним параметром у select(), ну или просто не нулевой таймаут.
Что это даст?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 14:11
поллинг смениться на ожидание (вечное в случае NULL) события в течении таймаута. man select/poll/epoll
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 14:40  [ТС]
А если select изменить на
C
1
int ret = poll( &fds, 2, хххх );
Где ххх задержка в мс, ну например 100
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 14:50
Лучше, просто скажите, какого поведения хочется добиться в итоге
А то может надо просто блокироваться в udev_monitor_receive_device() и никакие мультиплексоры вообще не нужны...
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 15:07  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Лучше, просто скажите, какого поведения хочется добиться в итоге
Воткнул флешку, прочитал action, прочитал devnode и все. Правда я потом нибильмес как снова запускать сканирование.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 15:20
Как-то так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
    while (1) {
            dev = udev_monitor_receive_device(mon);
            if (dev) {
                printf("Got Device\n");
                printf("   Node: %s\n", udev_device_get_devnode(dev));
                printf("   Action: %s\n", udev_device_get_action(dev));
                udev_device_unref(dev);
            }
            else {
                printf("No Device from receive_device(). An error occured.\n");
                break;
            }                   
    }
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 15:23  [ТС]
Ну вылетим из цикла, а запускать потом вручную ведь. Интересно, можно ли ловить именно ивент при изменении, что бы не гонять в цикле, или это только о D-bus?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 15:29
Вылетели из цикла == ошибка на сокете или мусор в данных - остается только сдохнуть.
Прочитали что-то из сокета = произошло одно из событий на которые вы подписались.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 15:38  [ТС]
Спасибо за советы! Скажите пожалуйста, почему прут эти ошибки, когда я дергаю флешку.
Resource temporarily unavailable [EAGAIN]. // Это ясно
Numerical result out of range [ERANGE]. // А это почему летит?
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
/dev/sda
change
/dev/sda
remove
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
remove
Object reference not set to an instance of an object
add
Resource temporarily unavailable [EAGAIN].
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
Numerical result out of range [ERANGE].
/dev/sda
add
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 15:43
Код нужен...
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 15:44  [ТС]
Код на Шарпе написан... Если есть смысл, я скину. Это происходит при вызове
C
1
udev_monitor_receive_device
И потом
C
1
action = udev_device_get_action
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 16:01
Походу, кто-то (сама libudev/шарп/кто-еще) ставит O_NONBLOCK на сокет. Варианты: снять флаг, вернуть poll/select
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 17:56  [ТС]
В общем я поковырялся и прочитал вот такое в коде библиотеки.
/// <summary>
/// Receive data from the udev monitor socket, allocate a new udev
/// device, fill in the received data, and return the device.
/// </summary>
/// <returns>
/// a new udev device, or <c>null</c>
/// </returns>
/// <remarks>
/// The monitor socket is by default set to NONBLOCK. A variant of poll() on
/// the file descriptor returned by <see cref="P:Fd" /> should to be used to
/// wake up when new devices arrive, or alternatively the file descriptor
/// switched into blocking mode.
/// </remarks>
Вы были правы! Буду думать как убрать эту блокировку.
Подскажите еще такой момент. Я работаю через udev, что будет, если я выключу комп с флешкой. А когда система запустится имя флешки не будет видно (/dev/sda или /dev/sdb)?

Добавлено через 5 минут
Что вообще дает блокировка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2018, 17:56
Помогаю со студенческими работами здесь

Получение имени каталога
Добрый день. При работе с файлами, возникает потребность превратить C:\Windows\Temp в просто Temp. Есть ли какой-либо встроенный метод...

Получение имени файла
У меня есть код для просмотра изображение при нажатии button, но не могу сделать так чтобы имя файла вместе с картинкой присваивалось label?

Получение имени окна
Админы тут баг в форуме я как то стер всю сваю тему!...

Получение имени файла
Подскажите как получить имя файла находящегося скажим в папке My music cредствами C#??

получение имени по ip из dyndns
У меня динамический реальный айпи и пользуюсь сервисом dyndns.com. Hostname, который я там привязал к своему айпи? пингуется из вне и к...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru