У меня есть две программы, работающие на моем Raspberry Pi. Один взаимодействует с пользователем, другой прослушивает сообщения и обновляет файл сообщений по указанию. Я хочу, чтобы другой сигнализировал первому, что сообщения были обновлены, чтобы первый мог перезагрузить файл сообщения. Я думал, что сигнал SIGUSR1 сделает то, что мне нужно. Однако, когда я поднимаю сигнал, моя программа завершает работу, которой все еще нужно продолжать прослушивание новых сообщений. Поэтому я создал тестовую программу «test_raise.cpp»:
#include <iostream>
#include <csignal>
int main(){
std::cout << "Ready to raise SIGUSR1." << std::endl;
std::raise(SIGUSR1);
std::cout << "SIGUSR1 has been raised." << std::endl;
}
Я использую этот компилятор: gcc версии 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1+deb9u1)
Который генерирует следующий вывод
pi@raspberrypi:~$./test_raise
Ready to raise SIGUSR1.
User defined signal 1
pi@raspberrypi:~$
Обратите внимание, что второй текстовый вывод не производится. Ни в одной документации, которую я просмотрел, не указано, что повышение завершает программу выдачи. (Я что-то пропустил?)
Это нормальная функция повышения? Есть ли способ делать сигналы без завершения программы? Какова моя лучшая альтернатива?
Благодарность...
Основываясь на ответе, у меня есть программа (вызванная до программы повышения), которая имеет обработчик сигнала USR1:
#include <iostream>
#include <csignal>
#include <unistd.h>
bool flag;
void signalHandler( int signum ) {
std::cout << "Interrupt signal (" << signum
<< ") received." << std::endl;
flag = true;
exit(signum);
}
int main () {
signal(SIGUSR1, signalHandler);
flag = false;
while(1) {
std::cout << "Sleeping...." << std::endl;
if (flag){
std::cout << "SIGUSR1 reception noted by main. "
<< std::endl;
flag = false;
}
sleep(1000*1000); // sleep 1 second
}
return 0;
}
Теперь есть обработчик, но сообщения так и не были получены, и программа повышения по-прежнему завершается до получения окончательного сообщения. Что мне здесь не хватает?
1 ответ
Если вы не установили обработчик сигналов для перехвата и обработки SIGUSR1
, то по умолчанию процесс завершается.
Если вы собираетесь обрабатывать сигнал, установите соответствующий обработчик сигнала и сделайте то, что вам нужно для обработки сигнала. (Помните, что в обработчике сигналов разрешено делать очень несколько вещей).
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.