Как обнаружить или протестировать создание узла unix/linux dev для вставки флэш-накопителя USB

Я кодирую на C в системе Linux. Я хочу вставить флэш-накопитель USB, позволить udev создать узлы разработки (например, в /dev/sdc и /dev/sdc1) и выполнить действие только при появлении /dev/sdc. Я думал об этом как о цикле ожидания в моем приложении C, ожидающем создания узла dev демоном udev. Что-то вроде следующего:

if( /* /dev/sdc exists */)
{
  do_something();
}
else
{
  wait();
}

Моя первая проблема заключается в том, какую функцию библиотеки C можно использовать в моем тесте if(), чтобы вернуть значение для «/dev/sdc exists». Моя вторая проблема в том, что я просто неправильно подхожу к этому? Должен ли я использовать структуру монитора udev, чтобы обнаружить это прямо из udev?


person Mark    schedule 12.08.2011    source источник


Ответы (2)


Вы можете взглянуть на fstat() из стандартной библиотеки. Это позволяет вам быстро проверить наличие/отсутствие файла и действовать в соответствии с этим. в основном вам нужно:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

....

struct stat s;
stat( "/pat/to/node" , &s );
if ( IS_BLK(s.st_mode) ) {
    /* the file exists and is a block device */
}

Это не элегантное решение, но отвечает на ваш вопрос. Код может нуждаться в некоторой настройке, потому что я не пробовал, но он должен помочь.

Ваше здоровье.

person amso    schedule 12.08.2011
comment
Я пробовал это, и это, кажется, работает. Для моих библиотек eglibc 2.10 это if ( S_ISBLK(s.st_mode) ){ /* The file exists and is a block device. */ }. Таким образом, единственной поправкой было имя макроса. Еще раз спасибо за помощь. - person Mark; 13.08.2011

Вероятно, вы захотите использовать правила udev.

Запуск внешних программ при определенных событиях

Еще одна причина для написания правил udev — запуск определенной программы, когда устройство подключено или отключено. Например, вы можете выполнить сценарий для автоматической загрузки всех ваших фотографий с цифровой камеры, когда она подключена.

person Maxim Egorushkin    schedule 12.08.2011
comment
Хотя это чисто для небольших автономных применений, если вы собираетесь интегрироваться в более крупную экосистему приложений, где контроль над udev невозможен, вы можете выяснить, как это сделать с помощью DBus... - person R.. GitHub STOP HELPING ICE; 12.08.2011