НАЙДЕННЫЕ ОШИБКИ
EINVAL Было задано неверное значение сигнала. Эта ошибка также возникает в случае попытки задания сигналов SIGKILL или SIGSTOP, которые не могут быть "перехвачены". EFAULT act, oldact, set, oldset или mask указывают на адрес, не входящий в адресное пространство процесса.
Пример
#include <signal.h> #include <stdio.h> sig_atomic_t sig_occured = 0; sig_atomic_t sig_out = 0; void sig_handler (int snum) { sig_occured = 1; sig_out++; } int main (void) { struct sigaction act; sigemptyset (&act.sa_mask); act.sa_handler = &sig_handler; act.sa_flags = 0; if (sigaction (SIGINT, &act, NULL) == -1) { fprintf (stderr, "sigaction() error\n"); return 1; } while (1) { if (sig_occured) { fprintf (stderr, "signal...\n"); sig_occured = 0; if (sig_out>10) exit(0); } } }
sig_atomic_t - специальный тип данных, математические операции по отношению к переменным данного типа являются атомарными и не могут быть прерваны
Пример 2
Процесс-сын #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> int main (int argc, char ** argv) { int year; if (argc < 2) { fprintf (stderr, "child: too few arguments\n"); return 2; } year = atoi (argv[1]); if (year <= 0) return 2; if (((year%4 == 0) && (year%100!= 0)) || (year%400 == 0)) kill (getppid (), SIGUSR1); Else kill (getppid (), SIGUSR2); exit(0); }
|