Поскольку связь Sip использует udp для отправки голосовых данных, существует обязательный буфер, необходимый для заполнения каждого кадра, 20 мс — это обычный объем данных, удерживаемых пакетом udp в связи sip.
Вы не сможете обойти его, но вы можете уменьшить его с помощью конфигурации
Я использую не freepbx, а Asterisk в качестве pbx, поэтому я не знаю, является ли это особенностью или просто задержкой вычислений. Возможно, вам следует рассмотреть возможность использования эквивалента прямой мультимедийной функции _, найденной в звездочке, чтобы согласование sip выполнялось через pbx, но полезная нагрузка rtp была прямой между одноранговыми узлами.
В основном это цель fork()
+ setsid()
.
#!/bin/bash
echo "Launching foo"
./foo
echo "Waking up"
#include <stdio.h>
#include <unistd.h>
int main(int ac, char ** av)
{
int pid;
for (int i=0; i<5; i++) {
sleep(1);
}
printf("OK, we count to 5.\n");
/*
* Here we fork() + setsid() to detach from parent process
* Return value of fork is 0 if you are in child, pid of the child
* if you're in the parent process
*/
pid = fork();
if (pid == 0) {
setsid();
printf("We forked, still running but shell may be back\n");
sleep(5);
printf("Exiting...\n");
} else {
return 0;
}
}
/tmp/pouet$ ps aux|grep foo
me 8595 0.5 0.1 217548 18576 pts/12 T 14:17 0:01 vim foo.c
me 9167 0.0 0.0 12716 912 pts/12 S+ 14:21 0:00 grep foo
/tmp/pouet$./bar.sh
Launching foo
OK, we count to 5.
We forked, still running but shell may be back
Waking up
/tmp/pouet$ ps aux|grep foo
me 8595 0.5 0.1 217548 18576 pts/12 T 14:17 0:01 vim foo.c
me 9189 0.0 0.0 4160 76 ? Ss 14:21 0:00./foo
me 9192 0.0 0.0 12716 940 pts/12 S+ 14:21 0:00 grep foo
/tmp/pouet$ Exiting...
/tmp/pouet$ ps aux|grep foo
me 8595 0.5 0.1 217548 18576 pts/12 T 14:17 0:01 vim foo.c
me 9212 0.0 0.0 12716 908 pts/12 S+ 14:21 0:00 grep foo
Один из способов — fork
, а затем оставить родителя.
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
int main(){
for (int i = 0; i < 1000000; i++){
std::cout << i << std::endl;
if (i == 50){
if (fork() != 0) {
_Exit(0);
}
}
}
}
Это может иметь нежелательные последствия, и использование _Exit
позволяет избежать наиболее очевидных последствий.
Другим способом является отправка программой C++ сигнала родителю. Это также завершает встроенную функцию ожидания (. Я не помню, это POSIX или просто башизм ).
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
int main(){
for (int i = 0; i < 1000000; i++){
std::cout << i << std::endl;
if (i == 50){
kill(getppid(), SIGINT);
}
}
}
Здесь следует обратить внимание на курс между сценарием и программой на C++. Вы можете посмотреть на trap
способ обработки сигнала в сценарии оболочки.