Причиной этих событий была моя строка статуса i3. Он определен в~/.config/i3/config
status_command while ~/.config/i3/status.sh; do sleep 1; done
Внутри status.sh
я звоню upower
, чтобы получить текущую информацию о батарее ноутбука.
Удаление вызовов upower
привело к прекращению событий NameOwnerChanged
.
По сути, каналы/файлы/сокеты или все, что вы подключили к stdin/stdout/stderr, являются потоками (*)из байтов . Соответствующие системные вызовы read()
и write()
, а их описания POSIX говорят:
The write() function shall attempt to write nbyte bytes from the buffer pointed to by buf to the file [...]
и
The read() function shall attempt to read nbyte bytes from the file associated with the open file descriptor, fildes, [...]
Кроме того, POSIX определяет байт как точно равный октету , то есть единице из восьми битов.
Таким образом, восьмибитный -битовый байт — это наименьшая единица, которую вы можете читать или записывать за раз, то есть «атом», если хотите.
Другое дело, что делают различные утилиты. read
по умолчанию читает строку, но библиотечная функция fgets()
тоже. В зависимости от оболочки вы можете попросить read
просто прочитать фиксированное количество байтов, например. в Баше:
$ echo foo | ( read -n 1 a; echo "first: $a"; read -n 1 b; echo "second: $b" )
first: f
second: o
Однако обратите внимание, что read
в Bash подчиняется локали и считает как символов , которые могут быть мульти -байтами. Но это не мешает нам читать отдельный байт вместо:
$ echo äöä | (read -n 1 a; echo "first: $a"; LC_ALL=C read -n 1 b; echo "second: $b" )
first: ä
second: �
(*Существуют также дейтаграммные сокеты, которые по-прежнему гранулированы по байтам -, но также содержат границы между сообщениями(из нуля или более байтов ), отправляемых в сокет. Вероятно, вы могли бы подключить правильно настроенный сокет дейтаграммы к stdin/stdout/stderr, но вряд ли кто-либо -когда-либо делал это.)