Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2009, 10:33   #1
Sailorotec
 
Регистрация: 30.11.2009
Сообщений: 6
По умолчанию sigset(), сложный вопрос

Описание этой функции в man:

If sigset() is used and disp is the address of a
signal handler, the system adds sig to the calling process's
signal mask before executing the signal handler; when the
signal handler returns, the system restores the calling
process's signal mask to its state prior to the delivery of
the signal.

Здесь говорится о некой системе.
Вопрос в следующем: какая именно часть системы имеется ввиду?
Спасибо.
Sailorotec вне форума Ответить с цитированием
Старый 05.12.2009, 11:28   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ниразу не понял
NiCola999 вне форума Ответить с цитированием
Старый 05.12.2009, 13:20   #3
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

sigset() используется для определения/переопределения обработчика сигнала. Собственно самими сигналами управляет операционная система, она же и вызывает действие, ассоциированное с данным сигналом. Все изменения - ТОЛЬКО в рамках данного процесса.
Рассмотрим параметры этой функции:
Код:
void(*sigset(int sig, void (*disp)()))();
параметр sig - это сам сигнал, который следует обрабатывать. Единственное исключение - нельзя переопределяет обработчики для сигналов SIGKILL и SIGSTOP.
Список всех сигналов можно посмотреть в справке, либо же в этой статье
disp - это указатель на уже известное системе действие (SIG_DFL - действие по умолчанию или же SIG_HOLD и SIG_IGN, подробнее в мане), либо же свой метод-обработчик.
Вот небольшой пример, показывающий, как задать обработчик для сигнала:

Код:
#include <signal.h>

void signal_handler() 
{
     printf("Получен сигнал прерывания!!!\n");
}

sigset(SIGINT, signal_handler);
В данном коде определяется некая функция signal_handler, которая назначается обработчиком сигнала SIGINT (сигнал прерывания, например было нажато Ctrl-C). Теперь при получении этого сигнала, процесс будет вызывать signal_handler, вместо действия по умолчанию (прерывания, в данном случае).
oleg kutkov вне форума Ответить с цитированием
Старый 05.12.2009, 14:20   #4
Sailorotec
 
Регистрация: 30.11.2009
Сообщений: 6
По умолчанию

oleg kutkov, спасибо, но мой вопрос про механизм работы sigset(). Другими словами, что происходит при вызове этой функции на более низком уровне? Какая часть ядра системы меняет маску сигнала данной нити?
Sailorotec вне форума Ответить с цитированием
Старый 05.12.2009, 14:47   #5
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

К сожалению я не владею данной информацией, т.к. не приходилось никогда разбираться с этим глубоко.
Но Вы всегда можете заглянуть в исходники ядра, благо они доступны, а конкретно в файл signal.c
oleg kutkov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложный расчет З/П VictorM Microsoft Office Excel 7 08.11.2009 16:51
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
Сложный вопрос по звуку Руслантус Общие вопросы C/C++ 6 31.03.2008 19:39
Сложный грид pkv БД в Delphi 15 09.11.2007 14:08