1d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* 2450ff20648579497cb788007438625aa74518d20subrata_modak * Copyright (C) Bull S.A. 1996 3d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Copyright (c) International Business Machines Corp., 2001 4d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 5d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * This program is free software; you can redistribute it and/or modify 6d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * it under the terms of the GNU General Public License as published by 7d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * the Free Software Foundation; either version 2 of the License, or 8d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * (at your option) any later version. 9d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 10d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * This program is distributed in the hope that it will be useful, 11d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * but WITHOUT ANY WARRANTY; without even the implied warranty of 12d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * the GNU General Public License for more details. 14d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 15d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * You should have received a copy of the GNU General Public License 16d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * along with this program; if not, write to the Free Software 174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 19d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 201be1c0c2f28892ffed0d2fcd34e551204060e22drobbiew| signal_test_02 | 21d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 22d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 23d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Description: Simplistic test to verify the signal system function | 24d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| calls: | 25d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 26d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Setup a signal-catching function for every possible | 27d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| signal. | 28d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Send signals to the process and verify that they | 29d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| were received by the signal-catching function. | 30d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Block a few signals by changing the process signal | 31d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| mask. Send signals to the process and verify that | 32d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| they indeed were blocked. | 33d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Add additional signals to the process signal mask. | 34d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Verify that they were blocked too. | 35d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Change the process signal mask to unblock one | 36d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| signal and suspend execution of the process until | 37d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| the signal is received. Verify that the unblocked | 38d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| signal is received. | 39d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 40d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| System calls: The following system calls are tested: | 41d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 42d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sigprocmask () - Sets the current signal mask | 43d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sigemptyset () - Creates and manipulates signal masks | 44d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sigfillset () - Creates and manipulates signal masks | 45d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sigaddset () - Creates and manipulates signal masks | 46d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sigdelset () - Creates and manipulates signal masks | 47d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sigsuspend () - Atomically changes the set of blocked | 48d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| signals and waits for a signal | 49d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sigaction () - Specifies the action to take upon | 50d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| delivery of a signal | 51d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| kill () - Sends a signal to a process | 52d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 53d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Usage: signal_test_03 | 54d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 55d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| To compile: cc -o signal_test_03 signal_test_03 | 56d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 57d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Last update: Ver. 1.2, 2/7/94 23:17:48 | 58d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 59d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Change Activity | 60d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 61d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Version Date Name Reason | 62d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| 0.1 050689 CTU Initial version | 63d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| 0.2 112293 DJK Rewrite for AIX version 4.1 | 64d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| 1.2 020794 DJK Move to "prod" directory | 65d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| 1.3 060501 VHM Port to work in linux | 66d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 67d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 68d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 69354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define SIGMAX 64 /* What should this number really be? _NSIG from bits/signum.h maybe? */ 70d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 71d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <stdio.h> 72045fd16a63837924a0f20d2419fbd497f8e36764robbiew#include <stdlib.h> 73d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <errno.h> 74d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <signal.h> 75f3a83d59cce260ab513313b2c43c41fc16983959robbiew#include <string.h> 76d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <unistd.h> 77d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <sys/types.h> 78d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 79d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* Macro for specifying signal masks */ 80d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define MASK(sig) (1 << ((sig) - 1)) 81d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 82d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include "signals.h" 83d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 84d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* Function prototypes */ 85354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid init_sig(); 86354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid handler(int sig); //, int code, struct sigcontext *); 87354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid reset_valid_sig(); 88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid sys_error(const char *, int); 89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid error(const char *, int); 90d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 91d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* Define an array for verifying received signals */ 92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint valid_sig[SIGMAX + 1]; 93d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 94d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 95d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| main () | 96d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 97d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 98d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Main program (see prolog for more details) | 99d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 100d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 101354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int argc, char **argv) 102d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 103354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigset_t setsig, /* Initial signal mask */ 104354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao newsetsig; /* Second signal mask */ 105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pid_t pid = getpid(); /* Process ID (of this process) */ 106d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 107d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* Print out program header */ 108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("%s: IPC TestSuite program\n\n", *argv); 109d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 1104bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 1114bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Establish signal handler for each signal & reset "valid signals" 1124bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * array 113d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao init_sig(); 115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao reset_valid_sig(); 116d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 117d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj sigemptyset(&setsig); 118cf0d626fe6224db3c714843dc7007e9f81d94a80Cyril Hrubis if (sigprocmask(SIG_SETMASK, &setsig, NULL) < 0) 119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigprocmask failed", __LINE__); 120d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 121d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 122d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Send SIGILL, SIGALRM & SIGIOT signals to this process: 123d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 124d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * First indicate which signals the signal handler should expect 125d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * by setting the corresponding valid_sig[] array fields. 126d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 1272c28215423293e443469a07ae7011135d058b671Garrett Cooper * Then send the signals to this process. 128d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 1294bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * And finally verify that the signals were caught by the signal 1304bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * handler by checking to see if the corresponding valid_sig[] array 131d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * fields were reset. 132d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\tSend SIGILL, SIGALRM, SIGIOT signals to process\n"); 134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[SIGILL] = 1; 135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[SIGALRM] = 1; 136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[SIGIOT] = 1; 137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGILL); 139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGALRM); 140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGIOT); 141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (valid_sig[SIGILL]) 143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao error("failed to receive SIGILL signal!", __LINE__); 144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (valid_sig[SIGALRM]) 145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao error("failed to receive SIGALRM signal!", __LINE__); 146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (valid_sig[SIGIOT]) 147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao error("failed to receive SIGIOT signal!", __LINE__); 148d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 1494bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 150d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Block SIGILL, SIGALRM & SIGIOT signals: 151d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 1524bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * First initialize the signal set so that all signals are excluded, 153d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * then individually add the signals to block to the signal set. 154d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 155d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Then change the process signal mask with sigprocmask (SIG_SETMASK). 156d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 157d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Verify that the desired signals are blocked from interrupting the 1584bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * process, by sending both blocked and unblocked signals to the 159d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * process. Only the unblocked signals should interrupt the process. 160d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\n\tBlock SIGILL, SIGALRM, SIGIOT signals, " 162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "and resend signals + others\n"); 163d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj sigemptyset(&setsig); 164d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 165354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigaddset(&setsig, SIGIOT) < 0) 166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigaddset (SIGIOT) failed", __LINE__); 167354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigaddset(&setsig, SIGILL) < 0) 168354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigaddset (SIGILL) failed", __LINE__); 169354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigaddset(&setsig, SIGALRM) < 0) 170354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigaddset (SIGALRM) failed", __LINE__); 171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 172cf0d626fe6224db3c714843dc7007e9f81d94a80Cyril Hrubis if (sigprocmask(SIG_SETMASK, &setsig, NULL) < 0) 173354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigaddset (SIGALRM) failed", __LINE__); 174354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[SIGFPE] = 1; 176354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[SIGTERM] = 1; 177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[SIGINT] = 1; 178354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGILL); 180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGALRM); 181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGIOT); 182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGFPE); 183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGTERM); 184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGINT); 185354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 186354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (valid_sig[SIGFPE]) 187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("failed to receive SIGFPE signal!", __LINE__); 188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (valid_sig[SIGTERM]) 189354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("failed to receive SIGTERM signal!", __LINE__); 190354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (valid_sig[SIGINT]) 191354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("failed to receive SIGINT signal!", __LINE__); 192d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 1934bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 194d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Block additional SIGFPE, SIGTERM & SIGINT signals: 195d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 196d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Create an other signal set to contain the additional signals to block 197d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * and add the signals to block to the signal set. 198d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 199d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Change the process signal mask to block the additional signals 200d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * with the sigprocmask (SIG_BLOCK) function. 201d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 2024bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Verify that all of the desired signals are now blocked from 2034bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * interrupting the process. None of the specified signals should 204d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * interrupt the process until the process signal mask is changed. 205d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 206354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\n\tBlock rest of signals\n"); 207354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigemptyset(&newsetsig); 208d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 209354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigaddset(&newsetsig, SIGFPE); 210354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigaddset(&newsetsig, SIGTERM); 211354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigaddset(&newsetsig, SIGINT); 212d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 213354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigprocmask(SIG_BLOCK, &newsetsig, &setsig) < 0) 214354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigprocmask failed", __LINE__); 215d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 216354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGILL); 217354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGALRM); 218354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGIOT); 219354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGFPE); 220354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGTERM); 221354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(pid, SIGINT); 222d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 2234bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 224d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Wait two seconds just to make sure that none of the specified 225d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * signals interrupt the process (They should all be blocked). 226d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 227354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sleep(2); 228d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 229d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 230d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Change the process signal mask: 231d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 232d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Now specifiy a new process signal set to allow the SIGINT signal 233d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * to interrupt the process. Create the signal set by initializing 234d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * the signal set with sigfillset () so that all signals are included 235d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * in the signal set, then remove the SIGINT signal from the set with 236d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * sigdelset (). 237d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 2384bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Force the process to suspend execution until delivery of an 239d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * unblocked signal (SIGINT in this case) with sigsuspend (). 240d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 241d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Additionally, verify that the SIGINT signal was received. 242d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 243354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[SIGINT] = 1; 244354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 245354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf 246354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ("\n\tChange signal mask & wait until signal interrupts process\n"); 247354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigfillset(&setsig) < 0) 248354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigfillset failed", __LINE__); 249354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigdelset(&setsig, SIGINT) < 0) 250354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigdelset failed", __LINE__); 251d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (sigsuspend(&setsig) != -1 || errno != 4) 252354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigsuspend failed", __LINE__); 253d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 254354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (valid_sig[SIGINT]) 255354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao error("failed to receive SIGIOT signal!", __LINE__); 256d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 257d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* Program completed successfully -- exit */ 258354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\nsuccessful!\n"); 259d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 260d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj return (0); 261d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 262d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 263d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 264d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| init_sig () | 265d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 266d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 267d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Initialize the signal vector for ALL possible signals | 268d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| (as defined in /usr/include/sys/signal.h) except for | 269d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| the following signals which cannot be caught or ignored: | 270d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 271d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o SIGKILL (9) | 272d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o SIGSTOP (17) | 273d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o SIGCONT (19) | 274d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 275d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Returns: n/a | 276d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 277d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 278354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid init_sig() 279d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 280d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj struct sigaction invec; 281354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char msg[256]; /* Buffer for error message */ 282354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int i; 283d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 284354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 1; i <= SIGMAX; i++) { 285d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 286d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* Cannot catch or ignore the following signals */ 287354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef _IA64 /* SIGWAITING not supported, RESERVED */ 288d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if ((i == SIGKILL) || (i == SIGSTOP) || 289354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (i == SIGCONT) || (i == SIGWAITING)) 290354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao continue; 291d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#else 292354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef _LINUX_ 293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((i == SIGKILL) || (i == SIGSTOP) 294354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao || ((i >= 32) && (i <= 34))) 295354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao continue; 296354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#else 297354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (i == SIGKILL || i == SIGSTOP || i == SIGCONT) 298354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao continue; 299354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 300d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#endif 301d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 302354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao invec.sa_handler = (void (*)(int))handler; 303354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigemptyset(&invec.sa_mask); 304d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj invec.sa_flags = 0; 305d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 306cf0d626fe6224db3c714843dc7007e9f81d94a80Cyril Hrubis if (sigaction(i, &invec, NULL) < 0) { 307354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sprintf(msg, "sigaction failed on signal %d", i); 308354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao error(msg, __LINE__); 309d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 310d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 311d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 312d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 313d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 314d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| handler () | 315d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 316d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 317d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Signal catching function. As specified in init_sig_vec() | 318d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| this function is automatically called each time a signal | 319d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| is received by the process. | 320d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 321d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Once receiving the signal, verify that the corresponding | 322d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| signal was expected. | 323d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 324d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Returns: Aborts program if an unexpected signal was received. | 325d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 326d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 327354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid handler(int sig) //, int code, struct sigcontext *scp) 328d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 329354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char msg[256]; 330d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 331d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* Check to insure that expected signal was received */ 332354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (valid_sig[sig]) { 333354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[sig] = 0; 334354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\treceived signal: (%s)\n", signames[sig]); 335d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else { 336354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sprintf(msg, "unexpected signal (%d,%s)", sig, 337354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (sig < 32) ? signames[sig] : "unknown signal"); 338354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao error(msg, __LINE__); 339d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 340d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 341d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 342d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 343d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| reset_valid_sig () | 344d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 345d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 346d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Reset the valid "signal" array | 347d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 348d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Returns: n/a | 349d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 350d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 351354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid reset_valid_sig() 352d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 353d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int i; 354d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 355354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < (SIGMAX + 1); i++) 356354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao valid_sig[i] = 0; 357d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 358d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 359d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 360d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sys_error () | 361d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 362d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 363d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Creates system error message and calls error () | 364d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 365d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 366354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid sys_error(const char *msg, int line) 367d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 368354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char syserr_msg[256]; 369d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 370354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sprintf(syserr_msg, "%s: %s\n", msg, strerror(errno)); 371354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao error(syserr_msg, line); 372d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 373d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 374d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 375d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| error () | 376d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 377d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 378d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Prints out message and exits... | 379d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 380d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 381354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid error(const char *msg, int line) 382d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 383354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, "ERROR [line: %d] %s\n", line, msg); 384354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao exit(-1); 385ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 386