Как передать данные в канал, пока он не заполнится, ни больше, ни меньше?

Я тоже застрял на "Загрузка начального RAM-диска". На самом деле в моем случае гостевой системой был Debian 64 -бит. И проблема решилась, когда я точно указал тип ОС в General > Basic > Version.enter image description here

3
14.08.2020, 14:40
2 ответа

Я бы не стал полагаться на этот элемент поведения. Каналы предназначены для непрерывного потока данных. Чтение и запись не могут быть легко сопоставлены друг с другом, единственная реальная гарантия, на которую вы должны полагаться, заключается в том, что первые байты на входе будут первыми байтами на выходе.

Причина ручного комментария относительно пейджингового буфера заключается в том, что каналы полагаются на кольцевой буфер.Из руководства я бы сделал вывод, что «кольцо» - это кольцо страниц, а не кольцо байтов. Страницы IE :заполняются, когда страница заполняется, используется следующая страница. Страницы не используются -повторно, пока они не будут полностью прочитаны. Это означает, что половина -прочитанной страницы будет вообще недоступна для записи. Это просто вывод из руководства, я не проверял исходный код.

Самая большая проблема, связанная с использованием этого поведения, заключается в том, что это деталь реализации, а не предполагаемый эффект конвейера. Разработчики ядра могут изменить это в любое время, и в вашем коде внезапно возникнут условия гонки.

2
18.03.2021, 23:12

Говорят, что если единственным намерением является синхронизация, то «классический способ», как вы его называете, никогда не использует каналы. Вместо этого используйте семафоры или сигналы.

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

Applications should not rely on a particular capacity

Если я правильно понимаю, то вы должны найти ответ на свой вопрос как часть справочной страницы для трубы:

POSIX.1-2001 says that write(2)s of less than PIPE_BUF bytes must be atomic: the output data is written to the pipe as a contiguous sequence. Writes of more than PIPE_BUF bytes may be nonatomic: the kernel may interleave the data with data written by other processes. POSIX.1-2001 requires PIPE_BUF to be at least 512 bytes. (On Linux, PIPE_BUF is 4096 bytes.) The precise semantics depend on whether the file descriptor is nonblocking (O_NONBLOCK), whether there are multiple writers to the pipe, and on n, the number of bytes to be written

0
18.03.2021, 23:12

Теги

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