Каковы последствия вызова write () с нулевой длиной? - PullRequest
5 голосов
/ 10 августа 2009

На довольно высоком уровне в функции write () Linux она отфильтровывает запросы на запись в буферы нулевой длины. Что имеет смысл. Кто бы хотел, чтобы ОС тратила время на сверление слоев, чтобы определить, что делать не нужно?

Ну ... я.

Это связано с вопросом ; и обнаружение, что побитный драйвер I2C даст потенциально полезный код возврата, если адрес (отправленный на шину перед данными) выдаст ошибку, если квитирование будет неправильным.

Можно отправлять фиктивные данные после адреса, но не с устройства, которое я использую. (Возможно, я попробую прочитать ...).

Итак, вопрос в следующем: Какого рода ад был бы выпущен, если бы ядро ​​разрешало запись нулевой (0) длины?

Ответы [ 6 ]

5 голосов
/ 10 августа 2009

То, что вы описываете, представляет собой по сути то же самое зло, которое заражает несколько API-интерфейсов Windows, которым требуется непредсказуемый объем памяти. Практика состоит в том, чтобы вызывать их без буфера для размещения их работы, они все равно выполняют эту работу, не сохраняя результаты, но подсчитывая количество байтов, которое им потребуется на этом пути. Затем вы выделяете буфер такого размера и снова вызываете функцию с буфером, зная размер.

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

Время программиста дорого, процессорное время дешево. Требуя от программистов писать один и тот же вызов API N раз, чтобы выяснить какое-то мировое состояние, в котором сам API мог бы работать самостоятельно, пытаясь перевернуть это с ног на голову.

Таким образом, рекомендуется, чтобы драйвер делал все возможное, чтобы обеспечить успешное выполнение write (). Если можно заранее предсказать, что это не удастся, проверив некоторое состояние мира, возможно, это должен быть ioctl ().

2 голосов
/ 14 августа 2009

Просто ради закрытия, я иду с идеей Уоррена Янга обновить драйвер и опубликовать патч (когда я получу раунд tuit ).

1 голос
/ 10 августа 2009

Я думаю, очень мало - возможно, что запись нулевой длины заблокируется, если буфер, в который записывается, также имеет нулевое доступное пространство, в некоторых драйверах. Запрет записи нулевой длины может упростить ситуацию в подобных случаях, а также избежать большого количества потраченной впустую работы.

Почему бы просто не снять этот чек и посмотреть, какой ад на самом деле вырвался? :)

0 голосов
/ 16 августа 2009

Что будет означать запись нулевой длины? В общем, запись означает передачу данных ... и я уверен, что больше проблем будет вызвано тем, что они не будут проверяться и, таким образом, перехватывать большинство плохих данных для драйверов. у

если это вызов "сделай это" с одним битом информации, то я думаю, что ioctl - это путь. Это не красиво, но что вы можете сделать?

В качестве альтернативы, выберите ядерную опцию, используйте mmap () и переместите все это в пространство пользователя. Низкие накладные расходы, и вы можете написать классический код poke, такой как «запись X в этот регистр», который почти кажется, что это то, что вам нужно.

0 голосов
/ 11 августа 2009

Мне не терпится предложить ioctl (), но разве это не будет лучшим интерфейсом для получения информации о состоянии интерфейса?

0 голосов
/ 10 августа 2009

несерьезный ответ: вы можете получить программу типа touch : P

...