IPCPOSIX на примере QNX Neutrino (Отчет о выполнении научно-исследовательской работы), страница 2

//файл sigact.c

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

void (*mysig (int sig, void (*handler) (int))) (int) // ”надежная” обработка
  //сигналов
{
 struct sigaction act;
 act.sa_handler = handler;  //установка обработчика сигнала  sig
 sigemptyset(&act.sa_mask);  //обнуление маски
 sigaddset(&act.sa_mask, SIGINT); //блокировка сигнала SIGINT
 act.sa_flags = 0;
 if(sigaction(sig, &act, 0) < 0)
  return (SIG_ERR);
 return (act.sa_handler);
}

)

Структура sigaction имеет следующий формат:

struct sigaction {
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
}

sa_handler задает тип действий процесса (SIG_DFL, SIG_IGN или указатель на функцию обработки сигнала).

sa_mask задает маску сигналов, которые должны блокироваться при обработке сигнала.

sa_flags содержит набор флагов, которые могут влиять на поведение процесса при обработке сигнала.

2. Блокировку реализуйте, вызвав "засыпание" процесса на одну минуту из обработчика пользовательских сигналов. В основной программе установите диспозицию этих сигналов.

sigact.c

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

void (*mysig(int sig, void(*handler)(void))) (int)

{

      struct sigaction act;

      act.sa_handler=handler;

      sigemptyset(&act.sa_mask);

      sigaddset(&act.sa_mask, SIGINT);

      act.sa_flags=0;

      if(sigaction(sig, &act, 0) < 0)

return(SIG_ERR);

      return(act.sa_handler);

}

void sigusr_1(void)

{

      printf("SIGUSR1, SIGINT blocked.....\n");

      sleep(20);

      printf("end\n");

}

void sigusr_2(void)

{

      printf("SIGUSR2, SIGINT blocked.....\n");

      sleep(20);

      printf("end\n");

}

int main( void )

{

      mysig( SIGUSR1, sigusr_1);  

mysig( SIGUSR2, sigusr_2);

      while(1)

      sleep(1);   return;

}

Результаты:

# gcc sigact.c -o sigact

# ./sigact&

[1] 1749040

# kill -s  SIGINT1

# kill -s  SIGUSR1 1749040

# SIGUSR1, SIGINT blocked.....

# kill -s  SIGUSR2 1749040

SIGUSR2, SIGINT blocked.....

# ps -l| grep sig

00000200 -     0    1749040     856108  -  10   0    -  636K -     ?        00:0

0:00 sigact

# kill -s  SIGINT 1749040

# ps -l| grep sig

00000200 -     0    1749040     856108  -  10   0    -  636K -     ?        00:0

0:00 sigact

end

# kill -s  SIGINT 1749040

/bin/sh: kill: 1749040: No such process

[1] + Interrupt            ./sigact

# ps -l| grep sig

3.  Измените обработчик так, чтобы отправка сигнала SIGINT производилась из обработчика функцией kill(SIGINT, getpid()); установив  в основной программе диспозицию:

struct sigaction act, oldact;
. . .
if(sigaction(sig, &act, &oldact) < 0)
  return (SIG_ERR);
 return (oldact.sa_handler);

sigact2.c