У меня есть приложение командной строки под названием 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
У кого-нибудь есть идеи, как это отладить? Предложения по запуску моей программы при запуске?