2014-01-15 4 views
0

Я запрограммировал простое приложение телефонии с использованием Gstreamer. Я также использую простые сокеты UDP для передачи сигналов. После получения специального сообщения через UDP мой Gstreamer должен начать и выполнить передачу. В настоящее время существует два процесса, которые должны инициировать после сигнализации была сделано:Выполнять два бесконечных процесса одновременно

процесс 1: отправка голоса с помощью микрофона (который всегда работает до тех пор, пока не будет остановлен вручную

Я использую исполняемый файл в сигнализации приложения сделать это:

if( ! strcmp(buf,"callee picked up ")) system("/home/fereydoon/udpSender"); 

и buf является тзд получил которое проверяется, должен ли udpSender выполняться

.

Процесс 2: Получение и декодирование входящих пакетов.

if( ! strcmp(buf,"callee picked up ")) system("/home/fereydoon/udpReceiver"); 

Когда я включать вышеуказанные строки кода в моем Signaling.c он продолжает посылать UDP голосовые пакеты просто отлично, но остальная часть кода (udpReceiver) не исполняется до тех пор, udpSender остановлен, что делает мою телефонию однонаправленный. Мне нужно, чтобы мой signaling.c начал процесс получения, когда выполняется udpSender. Я полагаю, что system() не обеспечивает такую ​​функциональность. Есть какой-либо способ сделать это?

P.S: Я использую Ubuntu 13,10 OS

+3

'system()' выполняет синхронно, блокируя вызывающий поток. Вы должны разветвить новый процесс или создать отдельный поток для первого вызова 'system' (с' fork' вы можете предпочесть 'execv'' udpSender' и/или ~ 'Receiver' вместо вызова' system() ', который выполняет оболочку, затем просит ее запустить вашу программу).(В качестве альтернативы, если остальная часть вашей программы работает на таком высоком уровне, то вам может не хватать написания сценария оболочки ...) –

+0

Что касается многопоточности или многопроцессорности? –

ответ

1

Добавить амперсанд в конце системы() вызывает.

system("/home/fereydoon/udpSender &"); 

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

+0

Спасибо, очень короткое и полезное –

1

От того, как вы описали проблему, это звучит, как вы не имеете два отдельных процессов в программном смысле работы. Всего две отдельные задачи. Ваша первая задача при выполнении блокирует поток управления, когда вы хотите, чтобы обе задачи запускались одновременно. Есть несколько способов сделать это, но проще всего поставить обе задачи в отдельные потоки. Каждый поток будет запускаться одновременно, и ваши две задачи будут работать одновременно.

Вы можете узнать больше о потоках в C++ здесь: http://codebase.eu/tutorial/posix-threads-c/

+0

Это тоже хороший подход, но я угадываю, добавляя, что APERSAND в конце системного каталога намного проще –

1

Вы проблема заключается в том, что system вызов блокируется. Итак, блок останова исполнения при первом вызове system.

Для распараллеливания вы должны использовать либо fork, либо pthreads.

Более простым решением будет начать исполняемые файлы в фоновом режиме, используя &:

if( ! strcmp(buf,"callee picked up ")) system("/home/fereydoon/udpSender &"); 
if( ! strcmp(buf,"callee picked up ")) system("/home/fereydoon/udpReceiver &"); 
Смежные вопросы