Найдено результатов: 2

Bash Обработка Труб

Кто-нибудь знает, как bash обрабатывает отправку данных по каналам?

cat file.txt | tail -20

Выводит ли эта команда все содержимое file.txt в буфер, который затем считывается tail? Или эта команда, скажем, выводит содержимое file.txt строка за строкой, а затем делает паузу в каждой строке для обработки хвоста, а затем запрашивает дополнительные данные?

Причина, по которой я спрашиваю, заключается в том, что я пишу программу на встроенном устройстве, которое в основном выполняет последовательность операций с некоторым куском данных, где выход одной операции отсылается в качестве входа следующей операции. Я хотел бы знать, как linux (bash) справляется с этим, поэтому, пожалуйста, дайте мне общий ответ, а не конкретно, что происходит, когда я запускаю "cat file.txt | tail -20".

Заранее благодарим вас за ваши ответы!

EDIT: Shog9 указал на соответствующую статью Википедии, это не привело меня непосредственно к статье, но это помогло мне найти это: http://en.wikipedia.org/wiki/Pipeline_% 28Unix%29#реализация , которая действительно имела информацию, которую я искал.


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

Я спрашиваю, как это handled/implemented., так как обе программы не могут работать одновременно, как данные передаются из stdin в stdout? Что произойдет, если первая программа генерирует данные значительно быстрее, чем вторая программа? Выполняет ли система просто первую команду до тех пор, пока она не завершится или не заполнится буфер stdout, а затем переходит к следующей программе и так далее в цикле, пока не останется больше данных для обработки, или есть более сложный механизм?

linux   bash   pipe   device    

445   3   22:04, 18th August, 2020


Узнайте, какой процесс имеет эксклюзивную блокировку на дескрипторе устройства USB

У меня есть библиотека, которая читает / записывает на устройство USB, используя CreateFile() API. Устройство реализует профиль HID-device, так что оно совместимо с драйвером класса Microsoft HID.

Некоторые другие приложения, установленные в системе, открывают устройство в режиме чтения / записи без режима общего доступа. Что мешает моей библиотеке (и всему, что ее потребляет) работать с устройством. Я полагаю, что это проблема с тем, чтобы быть HID-совместимым устройством - другое программное обеспечение драйвера (мыши, контроллеры, PHIDGETS и т. д.) Может быть несговорчивым.

В любом случае, путь к файлу устройства имеет вид:

1: "\\?\hid#hpqremhiddevice&col01#5&21ff20e7&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}".

2: "\\?\hid#vid_045e&pid_0023#7&34aa9ece&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}".

3: "\?\hid#vid_056a&pid_00b0&col01#6&5b05f29&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}".

И я пытаюсь открыть его с помощью кода, например:

//  First, open it with minimum permissions, this device may not be ours.
//  we'll re-open it later in read/write
hid_device_ref = CreateFile(
    device_path, GENERIC_READ,
    0, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, NULL);

Я рассматривал такой инструмент, как FileMon или Process Monitor от SysInternals. Но я не могу заставить его сообщать об использовании дескрипторов файлов устройств, подобных перечисленным выше.

c++   winapi   usb   hid   device    

412   4   09:14, 18th August, 2020