Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

21: int main {

22: sigset_t mask;

23: sigset_t oldMask;

24: struct sigaction act;

25: int i;

26:

27: /* Обрабатываемые в программе сигналы */

28: sigemptyset(&mask);

29: sigaddset(&mask, SIGRTMIN);

30: sigaddset(&mask, SIGRTMIN+1);

31: sigaddset(&mask, SIGUSR1);

32:

33: /* Отправить сигнал handler и сохранять их блокированными,

34: чтобы handler был сконфигурирован во избежание

35: состязаний при манипулировании глобальными переменными */

36: act.sa_handler = handler;

37: act.sa_mask = mask;

38: act.sa_flags = 0;

39:

40: sigaction(SIGRTMIN, &act, NULL);

41: sigaction(SIGRTMIN+1, &act, NULL);

42: sigaction(SIGUSR1, &act, NULL);

43:

44: /* Блокировать сигналы, с которыми мы работаем, чтобы

45: была видна очередность и порядок */

46: sigprocmask(SIG_BLOCK, &mask, &oldMask);

47:

48: /* Генерировать сигналы */

49: raise(SIGRTMIN+1);

50: raise(SIGRTMIN);

51: raise(SIGRTMIN);

52: raise(SIGRTMIN+1);

53: raise(SIGRTMIN);

54: raise(SIGUSR1);

55: raise(SIGUSR1);

56:

57: /* Разрешить доставку этих сигналов. Все они будут доставлены

58: прямо перед возвратом этого вызова (для Linux; это

59: НЕПЕРЕНОСИМОЕ поведение). */

60: sigprocmask(SIG_SETMASK, &oldMask, NULL);

61:

62: /* Отобразить упорядоченный список перехваченных сигналов */

63: printf("Принятые сигналы:\n");

64: for (i = 0; i < nextSig; i++)

65: if (sigOrder[i] < SIGRTMIN)

66: printf("\t%s\n", strsignal(sigOrder[i]));

67: else

68: printf("\tSIGRTMIN + %d\n", sigOrder[i] - SIGRTMIN);

69:

70: return 0;

71: }

Эта программа посылает себе некоторое количество сигналов и выводит на дисплей порядок их получения. Когда сигналы отправляются, она блокирует их, чтобы предотвратить немедленную доставку. Также она блокирует сигналы всякий раз, когда вызывается обработчик, устанавливая значение члена

sa_mask
структуры
struct sigaction
при настройке обработчика для каждого сигнала. Это предотвращает возможное состояние состязаний при обращении к глобальным переменным
nextSig
и
sigOrder
изнутри обработчика.

Запуск этой программы выдаст показанные ниже результаты.

Принятые сигналы:

User defined signal1

SIGRTMIN + 0

SIGRTMIN + 0

SIGRTMIN + 0

SIGRTMIN + 1

SIGRTMIN + 1

Это показывает, что все сигналы реального времени были доставлены, в то же время, был доставлен только один экземпляр сигнала

SIGUSR1
. Вы также видите изменение порядка сигналов реального времени — все сигналы
SIGRTMIN
были доставлены перед
SIGRTMIN + 1
.

12.7. Дополнительные сведения о сигналах

Сигналы, которые мы обсуждали до сих пор, не несли в себе никаких данных; появление сигнала — это единственная информация, которую получает приложение. В некоторых случаях было бы неплохо знать, что послужило причиной отправки сигнала (как, например, неправильная адресация памяти, генерирующая

SIGSEGV
), или же иметь возможность включить данные в сигналы, генерируемые приложением. Расширение реального времени Real Time Signals позволяет решить обе эти задачи.

  • Читать дальше
  • 1
  • ...
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: