Отправить сигнал от процесса на управляющий терминал

Поскольку связь Sip использует udp для отправки голосовых данных, существует обязательный буфер, необходимый для заполнения каждого кадра, 20 мс — это обычный объем данных, удерживаемых пакетом udp в связи sip.
Вы не сможете обойти его, но вы можете уменьшить его с помощью конфигурации

Я использую не freepbx, а Asterisk в качестве pbx, поэтому я не знаю, является ли это особенностью или просто задержкой вычислений. Возможно, вам следует рассмотреть возможность использования эквивалента прямой мультимедийной функции _, найденной в звездочке, чтобы согласование sip выполнялось через pbx, но полезная нагрузка rtp была прямой между одноранговыми узлами.

2
20.11.2019, 15:15
2 ответа

В основном это цель fork()+ setsid().

бар.ш

#!/bin/bash

echo "Launching foo"
./foo
echo "Waking up"

foo.c

#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
0
27.01.2020, 22:24

Один из способов — 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способ обработки сигнала в сценарии оболочки.

0
27.01.2020, 22:24

Теги

Похожие вопросы