Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> signal & alarm 
V
    Опции темы
ivzel
Дата 5.7.2011, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.7.2011

Репутация: нет
Всего: нет



Такой вот код:
Код

#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;


Это сообщение отредактировал(а) ivzel - 7.7.2011, 02:41
PM MAIL   Вверх
MAKCim
Дата 5.7.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



нужно так
Код

cout << "breaked!" << endl;



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ivzel
Дата 5.7.2011, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.7.2011

Репутация: нет
Всего: нет



Хм... Ну, печатать  оно стало. Но цикл что-то не прерывается.
PM MAIL   Вверх
MAKCim
Дата 5.7.2011, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ivzel
Дата 5.7.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.7.2011

Репутация: нет
Всего: нет



А есть где-то изложение того что объяснять долго: как это все работает и что прервется, а что нет? А то в "man signal" и  "man alarm" я это вычитать не сумел :( Или плохо читал?
PM MAIL   Вверх
svlary
Дата 6.7.2011, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(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;
}

PM MAIL   Вверх
ivzel
Дата 7.7.2011, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.7.2011

Репутация: нет
Всего: нет



Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0888 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.