Что происходит с содержимым последовательного порта tty после операции записи?

Команде notify-sendнеобходимо установить переменную окружения DBUS_SESSION_BUS_ADDRESS, и она должна вызываться владельцем этой сеансовой шины в качестве пользователя.

В следующем скрипте функция notify_usersищет все демоны dbus -, которые управляют сеансовой шиной. Командная строка такого демона выглядит так:

dbus-daemon --fork --session --address=unix:abstract=/tmp/dbus-ceVHx19Kiy

Для этого процесса определяется владелец и адрес dbus. Тогда мы можем использовать notify-send. Этот сценарий должен информировать всех пользователей, вошедших в систему с помощью сеанса GDM. Но я никогда не проверял это.

Примечание. :Если вы вызываете это как не -root, у вас может быть запрошен пароль из-за использования sudo.

#!/bin/bash

# Inform all logged on users
# Usage: notify_users TITLE MESSAGE [urgency [icon]]
notify_users()
{
    typeset title="$1"
    typeset message="$2"
    typeset urgency="${3:-critical}"
    typeset icon="${4:-}"

    case "$urgency" in
        "low") : ;;
        "normal") : ;;
        "critical") : ;;
        *)
            urgency="normal"
            ;;
    esac

    typeset ls user bus_addr

    typeset IFS=$'\n'

    # for all dbus-daemon processes that create a session bus
    for ln in "$(ps -eo user,args | grep "dbus-daemon.*--session.*--address=" | grep -v grep)"; do
        # get the user name
        user="$(echo "$ln" | cut -d' ' -f 1)"
        # get dbus address
        bus_addr="$(echo "$ln" | sed 's/^.*--address=//;s/.*$//')"
        # run notify-send with the correct user
        DBUS_SESSION_BUS_ADDRESS="$bus_addr" sudo -u $user -E /usr/bin/notify-send -u "$urgency" -i "$icon" "$title" "$message"
    done
}

state="$(upower -i $(upower -e | grep BAT))"

# if the state contains the word "discharging"
if [[ "$state" = *discharging* ]]; then

    perc=$(echo "$state" | grep "percentage" | awk '{print $2}' | tr -d '%')

    icon="$(echo "$state" | grep "icon-name:" | awk '{print $2}' | tr -d "'\"" )"

    if [ "$perc" -lt 15 ]; then
        notify_users "Battery Low!"  "Please plugin charger... charge is only $perc%" "critical" "$icon"
    fi
fi
0
04.03.2021, 21:19
1 ответ

Я отвечаю в другом порядке, чтобы мои ответы имели больше смысла.

[Запись на tty] просто добавляет файл и перемещает курсор?

Не совсем так. Терминал — это не блочное устройство, а символьное устройство. Вы записываете один байт в файл устройства, что в конечном итоге приводит к тому, что UART становится активным для передачи битов. Процесс повторяется для нескольких байтов.

Существует ли верхний предел того, что файл tty может хранить в данный момент, пока он не будет очищен?

Да, есть верхний предел. Буферы существуют в аппаратном и программном обеспечении. Если вы пишете на tty быстрее, чем он может передать, буферы заполняются и записывают операционные блоки.Точные размеры не знаю. Я ожидаю, что размер буфера 1 (может записывать только один байт за раз ).

Что я должен ожидать от содержимого моего tty-файла (/dev/ttyTHS2 )после того, как ПК запишет в него несколько необработанных байтов?

Насколько я знаю, tty по умолчанию не выводят эхо. При чтении из файла tty операция блокируется до тех пор, пока байт не будет получен извне.

Терминал знает только байты. Нет «сырых» или «приготовленных» байтов.

Очищается ли содержимое после операции записи?

Обычно вы не читаете из буфера записи, так что это не имеет значения.

Во всех этих ответах предполагается, что tty настроен с помощью IOCTL.

0
18.03.2021, 22:27

Теги

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