Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 26 стр.

UptoLike

Составители: 

26
struct two_words { int a, b; } memory;
void
handler(int signum)
{
printf ("%d,%d\n", memory.a, memory.b);
alarm (1);
}
int
main (void)
{
static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
signal (SIGALRM, handler);
memory = zeros;
alarm (1);
while (1)
{
memory = zeros;
memory = ones;
}
}
Существует два способа решить эту проблему:
1. использование элементарного типа данных. Таким типом данных является
sig_atomic_t. В общем случае, тип данных int и все типы данных,
размерностью меньшей, чем int являются элементарными;
2. обработка данных только в теле программы. При этом обработчик должен
только модифицировать флаг, используемый для синхронизации программы
и обработчика.
Генерация сигналов
Процесс может послать сигнал самому себе с использованием следующей
функции.
int raise(int SIGNUM)
Функция посылает сигнал вызывающему процессу. Возвращает 0 в случае
успеха и ненулевое значение в противном случае. Единственной возможностью
получения неблагоприятного результата является неверное значение SIGNUM. В
частности, raise может использоваться для выполнения действий, предписанных
сигналу по умолчанию.
Посылка сигналов другим процессам
Для посылки сигналы другим процессам может использоваться функция kill.
Она может использоваться для выполнения множества различных действий.
Необходимость посылать сигналы другим процессам возникает, например, в
следующих случаях:
родительский процесс запускает порожденный для выполнения некоторой
задачи, причем выполняющий неопределенный цикл, и завершает его, когда
в дальнейшем выполнении задачи нет необходимости;
процесс выполняется как один из процессов в группе и нуждается в
прерывании или информировании других процессов при возникновении
ошибки или какого-либо критического события;
два процесса необходимо синхронизировать при одновременном
выполнении.
int kill(pid_t PID, int SIGNUM)
       struct two_words { int a, b; } memory;

       void
       handler(int signum)
       {
         printf ("%d,%d\n", memory.a, memory.b);
         alarm (1);
       }

       int
       main (void)
       {
         static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
         signal (SIGALRM, handler);
         memory = zeros;
         alarm (1);
         while (1)
           {
             memory = zeros;
             memory = ones;
           }
       }
       Существует два способа решить эту проблему:
1.       использование элементарного типа данных. Таким типом данных является
         sig_atomic_t. В общем случае, тип данных int и все типы данных,
         размерностью меньшей, чем int являются элементарными;
2.       обработка данных только в теле программы. При этом обработчик должен
         только модифицировать флаг, используемый для синхронизации программы
         и обработчика.

       Генерация сигналов
       Процесс может послать сигнал самому себе с использованием следующей
функции.
       int raise(int SIGNUM)
        Функция посылает сигнал вызывающему процессу. Возвращает 0 в случае
успеха и ненулевое значение в противном случае. Единственной возможностью
получения неблагоприятного результата является неверное значение SIGNUM. В
частности, raise может использоваться для выполнения действий, предписанных
сигналу по умолчанию.

       Посылка сигналов другим процессам
       Для посылки сигналы другим процессам может использоваться функция kill.
Она может использоваться для выполнения множества различных действий.
Необходимость посылать сигналы другим процессам возникает, например, в
следующих случаях:
•         родительский процесс запускает порожденный для выполнения некоторой
          задачи, причем выполняющий неопределенный цикл, и завершает его, когда
          в дальнейшем выполнении задачи нет необходимости;
•         процесс выполняется как один из процессов в группе и нуждается в
          прерывании или информировании других процессов при возникновении
          ошибки или какого-либо критического события;
•         два процесса необходимо синхронизировать при одновременном
          выполнении.
       int kill(pid_t PID, int SIGNUM)



       26