2016-12-20 11 views
1

У меня есть программа на C++, которая запускает такой цикл, захватывая кадры с видеоустройства, используя проприетарный драйвер, к которому у меня нет доступа.Интерфейс C++ Stream в Linux

while(true) { 
    mybuf = getNextFrame(); // blocks 
} 

Я хотел бы построить некоторую логику с использованием других языков программирования, поэтому я думал об использовании следующего интерфейса. (Мне нужна только поддержка Linux) Я думал о наличии файла где-то, например: /my/video/device И каждый раз, когда я вызываю read() на нем, это даст мне текущий фрейм. Кроме того, если я снова вызову read(), я бы хотел, чтобы он блокировался до следующего кадра и возвращал это для меня. Кроме того, если я не вызываю open() некоторое время, я не хочу, чтобы промежуточные буферы были буферизованы.

Какой был бы лучший подход? Я пытался использовать FUSE для реализации файловой системы, но он пытался искать внутри файла, если он был обычным файлом, и будет читать только размер, указанный мной для файла. Затем я создал персональное устройство, но он никогда не назовет мою функцию read(), вместо этого будет сказано, что разрешение отклонено ...

Я думал о попытке CUSE или что-то в этом направлении. Я чем-то усложняю? Мне просто нужно иметь возможность работать с потоком фреймов, которые постоянно исходят из моего цикла C++, но я хочу анализировать их на другом языке, таком как Python или Go. Я также не хочу смешивать компиляцию моего кода на C++ с Go или python, я хочу, чтобы эти два были полностью разделены. Я подумал, что иметь какой-то файл API между ними облегчит ситуацию. Что было бы хорошим способом справиться с этим?

+0

Это именованная труба, какая вещь, которую вы ищете? –

+0

@ Zekian Я пробовал именованные каналы, но если приемный конец отключается, мой цикл существует. Мне нужно уметь подключаться и отсоединяться от трубы. –

ответ

0

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