Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
sigaction
Внесите приведенные далее изменения, так чтобы сигнал
SIGINT
sigaction
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void ouch(int sig) {
printf("OUCH! - I got signal %dn", sig);
}
int main() {
struct sigaction act;
<i> act.sa_handler = ouch;</i>
<i> sigemptyset(&act.sa_mask);</i>
<i> act.sa_flags = 0;</i>
<i> sigaction(SIGINT, &act, 0);</i>
while (1) {
printf("Hello World!n");
sleep(1);
}
}
Когда вы выполните эту версию программы, то всегда будете получать сообщение при нажатии комбинации клавиш <Ctrl>+<C>, поскольку
SIGINT
sigaction
SIIGQUIT
$ <b>./ctrlc2</b>
Hello World!
Hello World!
Hello World!
<b>^C</b>
OUCH! - I got signal 2
Hello World!
Hello World!
<b>^C</b>
OUCH! - I got signal 2
Hello World!
Hello World!
<b>^</b>
Quit
$
Как это работает
Программа вместо функции
signal
sigaction
ouch
SIGINT
sigaction
sigemptyset
После выполнения программы вы можете обнаружить дамп ядра (в файле core). Его можно безбоязненно удалить.
Множества сигналов
В заголовочном файле signal.h определены тип
sigset_t
sigaction
<b>#include <signal.h></b>
<b>int sigaddset(sigset_t *set, int signo);</b>
<b>int sigemptyset(sigset_t *set);</b>
<b>int sigfillset(sigset_t *set);</b>
<b>int sigdelset(sigset_t *set, int signo);</b>
Приведенные функции выполняют операции, соответствующие их названиям,
sigemptyset
sigfillset
sigaddset
sigdelset
signo
errno
EINVAL
Функция
sigismember
errno
EINVAL
<b>#include <signal.h></b>
<b>int sigismember(sigset_t *set, int signo);</b>
Маска сигналов процесса задается и просматривается с помощью функции
sigprocmask
<b>#include <signal.h></b>
<b>int sigprocmask(int how, const sigset_t *set, sigset_t *oset);</b>
Функция
sigprocmask
how
set
null
oset
Аргумент
how
□
SIG_BLOCK
set
□
SIG_SETMASK
set
□
SIG_UNBLOCK
set
Если аргумент
set
null
how
oset
Если функция
sigprocmask
how
errno
EINVAL