У меня есть две программы, работающие на моем 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
HalCat 21 Дек 2019 в 19:14

1 ответ

Если вы не установили обработчик сигналов для перехвата и обработки SIGUSR1, то по умолчанию процесс завершается.

Если вы собираетесь обрабатывать сигнал, установите соответствующий обработчик сигнала и сделайте то, что вам нужно для обработки сигнала. (Помните, что в обработчике сигналов разрешено делать очень несколько вещей).

2
Jesper Juhl 21 Дек 2019 в 19:26