fork или не fork
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 07.04.17 04:18
Оценка:
Вот в чём вопрос.
Есть приложение, которое обрабатывало видео с нескольких камер. Захват и декодирование осуществляется через ffmpeg, видео с каждой камеры в своём потоке.
Однако бывают случаи, когда в ответ на битый кадр ffmpeg где-то внутри себя вызывает exit и закрывал программу со всеми другими потоками.
Логично сделать родительский процесс, который ничего не анализирует, а будет запускать субпроцессы с захватом видео и смотреть, не завершился ли кто-то из них и перезапускать в этом случае.
Как принято делать такие вещи? Сделать один бинарник и вызывать fork для каждого видео? Или два разных бинарника, один из которых родительский, а другой — захват видео? Или этот момент вообще не принципиален, все делают, как хотят?
Re: fork или не fork
От: citrin Россия http://citrin.ru/
Дата: 07.04.17 14:16
Оценка:
Здравствуйте, Nuzhny, Вы писали:
N>Как принято делать такие вещи? Сделать один бинарник и вызывать fork для каждого видео? Или два разных бинарника, один из которых родительский, а другой — захват видео? Или этот момент вообще не принципиален, все делают, как хотят?

Конструкция с одним бинарником и форком (master/workers) встречается чаще. Хотя в целом не принципиально.
Re: fork или не fork
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.04.17 20:56
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Как принято делать такие вещи? Сделать один бинарник и вызывать fork для каждого видео? Или два разных бинарника, один из которых родительский, а другой — захват видео? Или этот момент вообще не принципиален, все делают, как хотят?


Я бы сделал один бинарник, чтобы не думать, что должен делать запускатель, если запускаемой программы вдруг не нашлось на диске, или по какой-то еще причине она не запускается.
Re: fork или не fork
От: vsb Казахстан  
Дата: 07.04.17 21:08
Оценка:
Я бы вообще вызывал стоковый ffmpeg, если это возможно, без всяких левых бинарников. А там глядишь и вашу программку можно будет выкинуть и заменить каким-нибудь простеньким shell-скриптом и всё станет ещё лучше. А если выбирать между этими двумя вариантами — один бинарник, зачем усложнять себе жизнь двумя разными программами, каких-то преимуществ это не принесёт.
Re: fork или не fork
От: watchmaker  
Дата: 07.04.17 21:26
Оценка: 6 (2) +1
Здравствуйте, Nuzhny, Вы писали:

N>Сделать один бинарник и вызывать fork для каждого видео? Или два разных бинарника, один из которых родительский, а другой — захват видео?

Я бы сказал, что тут три разных варианта: 1) fork, 2) fork+exec и два бинарника, 3) fork+exec и один бинарник. То есть вызвать через exec можно ведь и самого себя.
Зачем? Ну просто fork работает немного грязно: он копирует новому процессу память, обработчики сигналов, дескрипторы и прочее. Да, некоторое из этих нужно закрыть или подчистить при любом сценарии. Но всё равно дочернему процессу достанется куча ненужного. Например, память родительского процесса (heap, например) будет через copy-on-write доступна и в дочернем. Через некоторое время родительский процесс поменяет что-то в своей памяти, и копия в дочернем материализуется, в результате дочернему процессу достанется кусок данных, которые он не использует, но и не всегда может легко освободить.

То есть, если родительский процесс владеет какими-то большими ресурсами, то иногда может быть проще начать жизнь с чистого листа: вызвать exec и пусть он автоматически поосвобождает ненужное.
А программа может просто в начале понять (хоть с помощью параметра в argv[]), что она запущена в режиме slave/worker и начать идти по соответствующему пути.

Короче, я за один бинарник (ибо так удобнее и проще), но вызов (v)fork+exec это всё равно не исключает.
Re: fork или не fork
От: Sheridan Россия  
Дата: 13.04.17 05:26
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Как принято делать такие вещи? Сделать один бинарник и вызывать fork для каждого видео? Или два разных бинарника, один из которых родительский, а другой — захват видео? Или этот момент вообще не принципиален, все делают, как хотят?


Нарисуй демона и пусть задача перезапуска ложиццо на rc или там systemd. Я бы системд взял в оборот.
Matrix has you...
Re: fork или не fork
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 25.04.17 03:34
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Как принято делать такие вещи? Сделать один бинарник и вызывать fork для каждого видео? Или два разных бинарника, один из которых родительский, а другой — захват видео? Или этот момент вообще не принципиален, все делают, как хотят?


Всем спасибо за ответы. Я немного разобрался со всем этим хозяйством, а потом...
А потом сделал 2 бинарника, скачал boost 1.64, в котором появился модуль process и стал использовать его. Хоть у меня и linux only программа, но как-то мне бустом пользоваться комфортней, чем системозависимыми библиотеками — напрограммировался в молодости на чистом WinAPI. К тому же мне пригодился ещё и boost::interprocess.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.