Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > signal & alarm


Автор: ivzel 5.7.2011, 19:54
Такой вот код:
Код

#include <iostream>
#include <signal.h>
using namespace std;

static void onalrm(int signo)
{
    cout << "breaked!";
    return;
}

int main() {
    signal(SIGALRM, onalrm);
    if(alarm(3)!=0) {cout << "signal already exists"<< endl; return -1;}
    while(1){
    };
    return 0;
}

По идее, программа должна прерваться через 3 секунды, верно? Но она не прерывается. Что я делаю не так?

Заранее спасибо.

UPD: 
Проблема решена. Помогавшим спасибо.

Также следует сказать, что проблема встала, вообще-то, в связи с попыткой прервать при помощи таймера операцию recv на сокете. По какой-то причине моя программа (на Ubuntu 11.04) отсылала сигнал SIGALRM с флагом SA_RESTART. Проблема была решена заменой строки
Код

    signal(SIGALRM, onalrm);

на 
Код

    struct sigaction sa;
    sa.sa_handler = onalrm;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(SIGALRM, &sa, NULL) == -1) cout << "Can't set sigaction!"<<endl;

Автор: MAKCim 5.7.2011, 21:07
нужно так
Код

cout << "breaked!" << endl;

Автор: ivzel 5.7.2011, 22:27
Хм... Ну, печатать  оно стало. Но цикл что-то не прерывается.

Автор: MAKCim 5.7.2011, 22:39
Цитата(ivzel @  5.7.2011,  22:27 Найти цитируемый пост)
Хм... Ну, печатать  оно стало. Но цикл что-то не прерывается. 

цикл и не прервется
объяснять тут, чтобы стало понятно, долго

Автор: ivzel 5.7.2011, 22:47
А есть где-то изложение того что объяснять долго: как это все работает и что прервется, а что нет? А то в "man signal" и  "man alarm" я это вычитать не сумел :( Или плохо читал?

Автор: svlary 6.7.2011, 06:02
Цитата(ivzel @  5.7.2011,  22:47 Найти цитируемый пост)
А есть где-то изложение 

  Разумеется, есть. Наиболее известные книги :
  • Марк Дж Рочкинд "Программирование для UNIX" 2-е издание 2005 БХВ-Петербург
  • Уильям Стивенс "UNIX: Взаимодействие процессов" Мастер-класс. 2003 Питер
   Ну, URL я писать не буду - легко найдете, откуда скачать.

Добавлено через 10 минут и 58 секунд
Цитата(MAKCim @  5.7.2011,  22:39 Найти цитируемый пост)
Но цикл что-то не прерывается


Что бы он прервался. сделайте так :

Код

#include <iostream>
#include <signal.h>
using namespace std;

int do_work;

static void onalrm(int signo)
{
    cout << "breaked!";
    do_work = 0;
    return;
}
int main() {
    signal(SIGALRM, onalrm);
    do_work = 1;
    if(alarm(3)!=0) {cout << "signal already exists"<< endl; return -1;}
    while(do_work != 0){
    };
    return 0;
}

Автор: ivzel 7.7.2011, 02:42
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)