Проблема в Python (Ubuntu)

Ancillary data is received as if it were queued along with the first normal data octet in the segment (if any).

-- POSIX.1-2017

Что касается остальной части вашего вопроса, то все становится немного запутанным.

...For the purposes of this section, a datagram is considered to be a data segment that terminates a record, and that includes a source address as a special type of ancillary data.

Data segments are placed into the queue as data is delivered to the socket by the protocol. Normal data segments are placed at the end of the queue as they are delivered. If a new segment contains the same type of data as the preceding segment and includes no ancillary data, and if the preceding segment does not terminate a record, the segments are logically merged into a single segment...

A receive operation shall never return data or ancillary data from more than one segment.

Таким образом, современные сокеты BSD в точности соответствуют этому фрагменту. В этом нет ничего удивительного :-).

Помните, что стандарт POSIX был написан после UNIX и после разделения, такого как BSD и BSD. Система V. Одной из основных целей было помочь понять существующий диапазон поведения и предотвратить еще большее расщепление существующих функций.

Linux был реализован без ссылки на код BSD. Здесь он ведет себя по-другому.

  1. Если я вас правильно понял, похоже, что Linux дополнительно объединяет «сегменты», когда новый сегмент включает вспомогательные данные, а предыдущий сегмент — нет.

  2. Ваше замечание о том, что «Linux будет добавлять части вспомогательных -несущих сообщений в конец других сообщений до тех пор, пока во время этого вызова recvmsg не потребуется доставлять вспомогательную полезную нагрузку», кажется, не полностью объяснено стандартом.. Одним из возможных объяснений может быть состояние гонки. Если вы прочитаете часть «сегмента», вы получите вспомогательные данные. Возможно, Linux интерпретировал это как означающее, что оставшаяся часть сегмента больше не считается включенной в вспомогательные данные! Поэтому, когда получен новый сегмент, он объединяется -либо в соответствии со стандартом, либо в соответствии с разницей 1 выше.

Если вы хотите написать максимально переносимую программу, вам следует вообще избегать этой области. При использовании вспомогательных данных гораздо чаще используются сокеты дейтаграммы . Если вы хотите работать на всех странных платформах, которые технически стремятся предоставить что-то в основном похожее на POSIX, ваш вопрос, похоже, уходит в темный и непроверенный угол.


Можно утверждать, что Linux по-прежнему следует нескольким важным принципам:

  1. «Вспомогательные данные принимаются так, как если бы они были поставлены в очередь вместе с первым октетом обычных данных в сегменте».
  2. Вспомогательные данные никогда не "объединяются", как вы выразились.

Однако я не уверен, что поведение Linux особенно полезно , если сравнить его с поведением BSD. Похоже, что программа, которую вы описываете, должна была бы добавить обходной путь для Linux -. И я не знаю оправдания тому, почему Linux ожидает от вас этого.

Возможно, это выглядело разумно при написании кода ядра Linux, но никогда не тестировалось и не проверялось какой-либо программой.

Или это может быть осуществлено некоторым программным кодом, который в основном работает с этим подмножеством, но в принципе может иметь "ошибки" регистра крайних -или условия гонки.

Если вы не можете понять поведение Linux и его предполагаемое использование, я думаю, это довод в пользу того, чтобы рассматривать это как «темный, непроверенный угол» в Linux.

1
25.04.2021, 17:50
2 ответа

Кажется, вам не хватает пакета python3-distutils, установите через:

sudo apt install python3-distutils

См. также:

1
28.04.2021, 22:52

Вам необходимо установить python3.8-distutilsподходящий пакет для вашей версии Python(python3.8):

sudo apt install python3.8-distutils

Переключитесь на python3.8 после этого ответа .

Переустановитьpip3:

sudo apt remove python3-pip
cd /tmp
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3.8 get-pip.py
pip3 install pyrogram
1
28.04.2021, 22:52

Теги

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