Как запустить приложение C ++, PortAudio при запуске на Angstrom Linux на BeagleBoard? - PullRequest
2 голосов
/ 13 июня 2011

У меня есть приложение командной строки под названием xooky_nabox, которое было запрограммировано с использованием c ++. Он считывает патч puredata, обрабатывает сигналы от аудиовхода гнезда beagleboard и выводит сигналы через аудиовыход.

Я хочу, чтобы приложение запускалось, когда beagleoard запускается и продолжает работать, пока плата не будет закрыта. Там нет графического интерфейса и клавиатуры или монитора, только аудио входы и выходы.

Если я запускаю приложение вручную, все работает нормально:

xooky_nabox -audioindev 1 -audiooutdev 1 /var/xooky/patch.pd

И он также работает нормально, если я запускаю его в фоновом режиме:

xooky_nabox -audioindev 1 -audiooutdev 1 /var/xooky/patch.pd &

Теперь позвольте мне показать схему кода двух версий программы (полная информация по адресу https://github.com/rvega/XookyNabox):

Версия 1, основной поток поддерживается:

void sighandler(int signum){
  time_t rawtime;
  time(&rawtime);

  std::ofstream myfile;
  myfile.open ("log.txt",std::ios::app);
  myfile << ctime(&rawtime) << "   Caught signal:" << signum << " " << strsignal(signum) << "\n";
  myfile.close();
  if(signum == 15 || signum == 2){
     exit(0);
  }
}


int main (int argc, char *argv[]) {
   // Subscribe to all system signals for debugging purposes.
   for(int i=0; i<64; i++){
      signal(i, sighandler);
   }   

   // Sanity checks, error and help messages, etc.
   parseParameters(argc, argv);

   //Start Signal processing and Audio
   initZenGarden();
   initAudioIO();

   // Keep the program alive.
   while(1){
      sleep(10);
   }

   // This is obviously never reached, so far no problems with that...
   stopAudioIO();
   stopZengarden();

   return 0;
}

static int paCallback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData ){
   // This is called by PortAudio when the output buffer is about to run dry.
}

Версия 2, выполнение разветвляется и отсоединяется от терминала, который его запустил:

void go_daemon(){
   // Run the program as a daemon.
   pid_t pid, sid;
   pid = fork(); // Fork off the parent process
   if (pid < 0) {
      exit(EXIT_FAILURE);
   }
   if (pid > 0) {
      exit(EXIT_SUCCESS); // If child process started ok, exit the parent process
   }
   umask(0); // Change file mode mask

   sid = setsid(); // Create a new session ID for the child process
   if (sid < 0) {
      // TODO: Log failure
      exit(EXIT_FAILURE);
   }

   if((chdir("/")) < 0){ //Change the working directory to "/"
      //TODO: Log failre
      exit(EXIT_FAILURE);
   }

   close(STDIN_FILENO);
   close(STDOUT_FILENO);
   close(STDERR_FILENO);
}

int main (int argc, char *argv[]) {
   go_daemon();      

   // Subscribe to all system signals for debugging purposes.
   for(int i=0; i<64; i++){
      signal(i, sighandler);
   }   

   // Sanity checks, error and help messages, etc.
   parseParameters(argc, argv);

   //Start Signal processing and Audio
   initZenGarden();
   initAudioIO();

   // Keep the program alive.
   while(1){
      sleep(10);
   }

   // This is obviously never reached, so far no problems with that...
   stopAudioIO();
   stopZengarden();

   return 0;
}

Попытка запустить его при запуске

Я попытался запустить обе версии программы при запуске несколькими способами. Результат всегда один и тот же. Когда бигль запускается, я слышу звуковой сигнал в течение доли секунды, затем звук останавливается и отображается экран входа в систему (у меня есть последовательный терминал, подключенный к плате, и мини-компьютер, запущенный на моем компьютере). Самым странным для меня является то, что процесс xooky_nabox фактически выполняется после входа в систему, но звук не выводится ...

Вот что я пробовал:

Добавление записи @reboot в crontab и запуск программы с конечным амперсандом (версия 1 программы):

@reboot   xooky_nabox <params> &

Добавлен демон запуска-остановки в crontab (версия 1):

@reboot start-stop-daemon -S -b --user daemon -n xooky_nabox -a /usr/bin/xooky_nabox -- <params>

Создал скрипт в /etc/init.d/xooky и сделал

$chmod +x xooky
$update-rc.d xooky defaults

И пробовал разные версии сценария запуска: start-stop-daemon с версией 1, вызывающий программу напрямую с конечным амперсандом (версия 1), вызывающий программу без конечного амперсанда (версия 2).

Кроме того, если я запускаю программу вручную с последовательного терминала или из сеанса SSH (USB-сети); и затем я запускаю top, программа будет работать нормально в течение нескольких секунд, потребляя около 15% процессора. Затем он прекратит выводить звук, и его потребление процессора возрастет примерно до 30%. В моем файле log.txt в этом сценарии ОС не передает сигнал программе.

Когда версия 2 программы запускается при запуске, журнал покажет что-то вроде:

Mon Jun  6 02:44:49 2011 Caught signal:18 Continued
Mon Jun  6 02:44:49 2011 Caught signal:15 Terminated

У кого-нибудь есть идеи, как это отладить? Предложения по запуску моей программы при запуске?

Ответы [ 3 ]

0 голосов
/ 25 июня 2011

Существует функция C для создания демона

#include <unistd.h>

int daemon(int nochdir, int noclose);

Более подробную информацию можно найти на страницах руководства для daemon(3) Может быть, это поможет.

И если вы хотите запуститьдемон, когда вы запускаете linux, вы должны выяснить, какую версию init вы используете в своем дистрибутиве, но обычно вы можете просто добавить команду для запуска вашего демона в /etc/init.d/rc (но это не очень хорошая идея)Этот файл выполняется init при запуске linux.

0 голосов
/ 08 января 2012

Я закончил тем, что отключил PortAudio и внедрил JACK-клиент, который запускает свой собственный сервер, поэтому эта проблема для меня больше не актуальна.

0 голосов
/ 13 июня 2011

В версии 2 Я думаю, что вы должны opendup2) /dev/null до STDIN / STDOUT / STDERR. Просто закрытие ручки может вызвать проблемы.

как то так:

int fd = open("/dev/null", O_RDWR);
dup2( fd, STDOUT_FILENO );

(Понятия не имею, что делает start-stop-daemon. Не могу помочь версии 1, извините)

...