Что такое отдельный «атом» в стандартном потоке в Linux?

Причиной этих событий была моя строка статуса i3. Он определен в~/.config/i3/config

status_command while ~/.config/i3/status.sh; do sleep 1; done

Внутри status.shя звоню upower, чтобы получить текущую информацию о батарее ноутбука.

Удаление вызовов upowerпривело к прекращению событий NameOwnerChanged.

0
25.10.2021, 11:50
1 ответ

По сути, каналы/файлы/сокеты или все, что вы подключили к 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, но вряд ли кто-либо -когда-либо делал это.)

3
25.10.2021, 12:22

Теги

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