signal.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 // Author: Jens-S. V?ckler <voeckler@rvs.uni-hannover.de>
10 // File: signal.cc
11 // Date: Sat Feb 28 1998
12 // Compiler: gcc 2.7.2.x series
13 //
14 // Books: W. Richard Steven, "Advanced Programming in the UNIX Environment",
15 // Addison-Wesley, 1992.
16 //
17 // (c) 1998 Lehrgebiet Rechnernetze und Verteilte Systeme
18 // Universit?t Hannover, Germany
19 //
20 // Permission to use, copy, modify, distribute, and sell this software
21 // and its documentation for any purpose is hereby granted without fee,
22 // provided that (i) the above copyright notices and this permission
23 // notice appear in all copies of the software and related documentation,
24 // and (ii) the names of the Lehrgebiet Rechnernetze und Verteilte
25 // Systeme and the University of Hannover may not be used in any
26 // advertising or publicity relating to the software without the
27 // specific, prior written permission of Lehrgebiet Rechnernetze und
28 // Verteilte Systeme and the University of Hannover.
29 //
30 // THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
31 // EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
32 // WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
33 //
34 // IN NO EVENT SHALL THE LEHRGEBIET RECHNERNETZE UND VERTEILTE SYSTEME OR
35 // THE UNIVERSITY OF HANNOVER BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
36 // INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
37 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
38 // ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
39 // ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
40 // SOFTWARE.
41 //
42 // Revision 1.3 1999/01/19 13:11:52 cached
43 // adaptations necessary for AIX.
44 //
45 // Revision 1.2 1999/01/19 11:00:50 voeckler
46 // added psignal(int,const char*) compatibility function.
47 //
48 // Revision 1.1 1998/08/13 21:51:58 voeckler
49 // Initial revision
50 //
51 
52 #include "squid.h"
53 #include "signal.hh"
54 
55 #include <cerrno>
56 #include <cstring>
57 #include <memory.h>
58 #include <unistd.h>
59 #include <sys/wait.h>
60 
61 SigFunc*
62 Signal( int signo, SigFunc* newhandler, bool doInterrupt )
63 // purpose: install reliable signals
64 // paramtr: signo (IN): signal for which a handler is to be installed
65 // newhandler (IN): function pointer to the signal handler
66 // doInterrupt (IN): interrupted system calls wanted!
67 // returns: the old signal handler, or SIG_ERR in case of error.
68 {
69  struct sigaction action, old;
70 
71  memset( &old, 0, sizeof(old) );
72  memset( &action, 0, sizeof(action) );
73 
74  // action.sa_handler = newhandler; I HATE TYPE-OVERCORRECTNESS !
75  memmove( &action.sa_handler, &newhandler, sizeof(SigFunc*) );
76  sigemptyset( &action.sa_mask );
77 
78  if ( signo == SIGCHLD ) {
79  action.sa_flags |= SA_NOCLDSTOP;
80 
81 #ifdef SA_NODEFER
82  action.sa_flags |= SA_NODEFER; // SYSV: don't block current signal
83 #endif
84  }
85 
86  if ( signo == SIGALRM || doInterrupt ) {
87 #ifdef SA_INTERRUPT
88  action.sa_flags |= SA_INTERRUPT; // SunOS, obsoleted by POSIX
89 #endif
90  } else {
91 #ifdef SA_RESTART
92  action.sa_flags |= SA_RESTART; // BSD, SVR4
93 #endif
94  }
95 
96  return ( sigaction( signo, &action, &old ) < 0 ) ?
97  (SigFunc*) SIG_ERR :
98  (SigFunc*) old.sa_handler;
99 }
100 
101 SIGRETTYPE
102 sigChild( int signo )
103 // purpose: supply ad hoc child handler with output on stderr
104 // paramtr: signo (IN): == SIGCHLD
105 // returns: only if OS uses a return type for signal handler
106 // seealso: Stevens, UNP, figure 5.11 *and* Stevens, APUE, figure 8.3
107 {
108  pid_t pid;
109  int status = signo; // to stop GNU from complaining...
110 
111  int saveerr = errno;
112  while ( (pid = waitpid( -1, &status, WNOHANG )) > 0 ) {
113  if ( WIFEXITED(status) ) {
114  fprintf( stderr, "child (pid=%ld) reaped, status %d\n%c",
115  (long) pid, WEXITSTATUS(status), 0 );
116  } else if ( WIFSIGNALED(status) ) {
117  fprintf( stderr, "child (pid=%ld) died on signal %d%s\n%c",
118  (long) pid, WTERMSIG(status),
119 #ifdef WCOREDUMP
120  WCOREDUMP(status) ? " (core generated)" : "",
121 #else
122  "",
123 #endif
124  0 );
125  } else {
126  fprintf( stderr, "detected dead child (pid=%ld), status %d\n%c",
127  (long) pid, status, 0 );
128  }
129  }
130  errno = saveerr;
131 
132 #if SIGRETTYPE != void
133  return 0;
134 #endif
135 }
136 
#define SA_NODEFER
SigFunc * Signal(int signo, SigFunc *newhandler, bool doInterrupt)
Definition: signal.cc:62
SIGRETTYPE sigChild(int signo)
Definition: signal.cc:102
#define SA_RESTART
static pid_t pid
Definition: IcmpSquid.cc:35

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors