📄 sig.c
字号:
/* * OpenMODBUS/TCP to RS-232/485 MODBUS RTU gateway * * sig.c - signals management procedures * * Copyright (c) 2002-2003, Victor Antonovich (avmlink@vlink.ru) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: sig.c,v 1.1.1.1 2003/09/13 20:38:33 kapyar Exp $ */ #include "sig.h"#include "tty.h"/* signal flag */volatile sig_atomic_t sig_flag = 0;/* internal prototypes */void sig_bus(int signum);void sig_segv(int signum);void sig_handler(int signum);/* * Signal handler initialization * Return: none */voidsig_init(void){ struct sigaction sa; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGSEGV); sigaddset(&sa.sa_mask, SIGBUS); sigaddset(&sa.sa_mask, SIGTERM); sigaddset(&sa.sa_mask, SIGHUP); sigaddset(&sa.sa_mask, SIGINT); sigaddset(&sa.sa_mask, SIGPIPE); sigaddset(&sa.sa_mask, SIGCHLD); sigaddset(&sa.sa_mask, SIGALRM); sigaddset(&sa.sa_mask, SIGUSR1); sigaddset(&sa.sa_mask, SIGUSR2); sa.sa_handler = sig_segv; sigaction(SIGSEGV, &sa, NULL); sa.sa_handler = sig_bus; sigaction(SIGBUS, &sa, NULL); sa.sa_handler = sig_handler; sigaction(SIGTERM, &sa, NULL); sa.sa_handler = sig_handler; sigaction(SIGHUP, &sa, NULL); sa.sa_handler = sig_handler; sigaction(SIGINT, &sa, NULL); sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, NULL); sa.sa_handler = SIG_IGN; sigaction(SIGCHLD, &sa, NULL); sa.sa_handler = SIG_IGN; sigaction(SIGALRM, &sa, NULL); sa.sa_handler = SIG_IGN; sigaction(SIGUSR1, &sa, NULL); sa.sa_handler = SIG_IGN; sigaction(SIGUSR2, &sa, NULL);}/* * SIGSEGV signal handler */voidsig_segv(int signum){#ifndef SAFESIG signum = signum; /* prevent compiler warning */ fprintf(stderr, "caught SIGSEGV, dumping core..."); fclose(stderr);#endif abort();}/* * SIGBUS signal handler */voidsig_bus(int signum){#ifndef SAFESIG signum = signum; /* prevent compiler warning */ fprintf(stderr, "caught SIGBUS, dumping core..."); fclose(stderr);#endif abort();}/* * Unignored signals handler */voidsig_handler(int signum){#ifndef SAFESIG tty_sighup();#endif sig_flag = signum;}/* * Signal action execution */voidsig_exec(void){#ifdef LOG static char *signames[] = { "", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", "BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM" }; log(2, "Terminated by signal: SIG%s", signames[sig_flag]);#endif /* currently simply exit the program */ exit(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -