Состояние захвата доступа устройства evdev

Мой ответ - это вариация типичного ответа для поиска "foobar" в листинге 'ps'. Аргумент "-A" "ps" более портативен, чем "aux", я полагаю, но это изменение не имеет отношения к ответу. Типичный ответ выглядит так:

$ ps -A -ww | grep [f]oobar

Вместо этого я использую такой шаблон:

$ ps -A -ww | grep [^]]foobar

Главное преимущество в том, что на основе этого шаблона легче писать скрипты, потому что вы просто конкатенируете статическую строку "[^]]" с любым шаблоном, который вы ищете. Вам не нужно отделять первую букву строки, затем вставлять ее между квадратными скобками, а затем снова объединять. При написании сценариев в shell проще просто вставить "[^]]" перед искомым шаблоном. Нарезка строк в Bash - уродливая вещь, поэтому моя вариация позволяет избежать этого. В этой вариации говорится, что нужно показать строки, в которых шаблон совпадает БЕЗ ведущей правой квадратной скобки ]. Поскольку шаблон поиска для исключения квадратной скобки фактически добавляет квадратную скобку к шаблону, он никогда не будет совпадать сам с собой.

Поэтому вы можете написать переносимую команду 'psgrep' следующим образом. Здесь я делаю некоторые поправки на различия между Linux, OS X BSD и другими. Это добавляет заголовки столбцов из 'ps', обеспечивает более пользовательский формат 'ps', который лучше подходит для моих нужд, и отображает листинг процессов очень, очень широко, чтобы ни один из аргументов командной строки не был пропущен. Ну, большинство не пропущено. Java есть Java, она часто делает вещи наихудшим возможным способом, так что некоторые java-сервисы будут работать с превышением максимально допустимой длины аргументов, которую отслеживает таблица процессов. Я полагаю, что это 1024 символа. Длина команды-одиночки, разрешенная для запуска процесса, намного больше, но таблица процессов ядра не беспокоится о том, чтобы отслеживать все, что превышает 1K в длину. После запуска команды имя команды и список аргументов больше не нужны, поэтому то, что сохраняется в таблице процессов, носит информационный характер.

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}
2
07.01.2019, 02:09
1 ответ

Чтобы определить, захвачено ли устройство в данный момент, из пользовательского пространства вы можете попытаться захватить его самостоятельно; либо используяEVIOCGRABioctlсамостоятельно, либо libevdev_grabвlibevdev:

if (!ioctl(evdevfd, EVIOCGRAB, (void *) 1)) {
    // We grabbed the device, no one else had it; release it
    ioctl(evdevfd, EVIOCGRAB, (void *) 0);
} else if (errno == EBUSY) {
    // The device is busy, someone else has it
} else {
    // Something else went wrong
}

или

struct libevdev *dev;
libevdev_new_from_fd(evdevfd, &dev);
if (!libevdev_grab(dev, LIBEVDEV_GRAB)) {
    // We grabbed the device, no one else had it; release it
    libevdev_grab(dev, LIBEVDEV_UNGRAB);
} else if (errno == EBUSY) {
    // The device is busy, someone else has it
} else {
    // Something else went wrong
}

(Щедро посыпать обработкой ошибок -; evdevfd— дескриптор открытого файла интересующего вас устройства evdev.)

3
27.01.2020, 22:02

Теги

Похожие вопросы