diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 119 |
1 files changed, 0 insertions, 119 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 1368e67c8482..4c8f49eadf7d 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -38,125 +38,6 @@ | |||
38 | 38 | ||
39 | static struct kmem_cache *sigqueue_cachep; | 39 | static struct kmem_cache *sigqueue_cachep; |
40 | 40 | ||
41 | /* | ||
42 | * In POSIX a signal is sent either to a specific thread (Linux task) | ||
43 | * or to the process as a whole (Linux thread group). How the signal | ||
44 | * is sent determines whether it's to one thread or the whole group, | ||
45 | * which determines which signal mask(s) are involved in blocking it | ||
46 | * from being delivered until later. When the signal is delivered, | ||
47 | * either it's caught or ignored by a user handler or it has a default | ||
48 | * effect that applies to the whole thread group (POSIX process). | ||
49 | * | ||
50 | * The possible effects an unblocked signal set to SIG_DFL can have are: | ||
51 | * ignore - Nothing Happens | ||
52 | * terminate - kill the process, i.e. all threads in the group, | ||
53 | * similar to exit_group. The group leader (only) reports | ||
54 | * WIFSIGNALED status to its parent. | ||
55 | * coredump - write a core dump file describing all threads using | ||
56 | * the same mm and then kill all those threads | ||
57 | * stop - stop all the threads in the group, i.e. TASK_STOPPED state | ||
58 | * | ||
59 | * SIGKILL and SIGSTOP cannot be caught, blocked, or ignored. | ||
60 | * Other signals when not blocked and set to SIG_DFL behaves as follows. | ||
61 | * The job control signals also have other special effects. | ||
62 | * | ||
63 | * +--------------------+------------------+ | ||
64 | * | POSIX signal | default action | | ||
65 | * +--------------------+------------------+ | ||
66 | * | SIGHUP | terminate | | ||
67 | * | SIGINT | terminate | | ||
68 | * | SIGQUIT | coredump | | ||
69 | * | SIGILL | coredump | | ||
70 | * | SIGTRAP | coredump | | ||
71 | * | SIGABRT/SIGIOT | coredump | | ||
72 | * | SIGBUS | coredump | | ||
73 | * | SIGFPE | coredump | | ||
74 | * | SIGKILL | terminate(+) | | ||
75 | * | SIGUSR1 | terminate | | ||
76 | * | SIGSEGV | coredump | | ||
77 | * | SIGUSR2 | terminate | | ||
78 | * | SIGPIPE | terminate | | ||
79 | * | SIGALRM | terminate | | ||
80 | * | SIGTERM | terminate | | ||
81 | * | SIGCHLD | ignore | | ||
82 | * | SIGCONT | ignore(*) | | ||
83 | * | SIGSTOP | stop(*)(+) | | ||
84 | * | SIGTSTP | stop(*) | | ||
85 | * | SIGTTIN | stop(*) | | ||
86 | * | SIGTTOU | stop(*) | | ||
87 | * | SIGURG | ignore | | ||
88 | * | SIGXCPU | coredump | | ||
89 | * | SIGXFSZ | coredump | | ||
90 | * | SIGVTALRM | terminate | | ||
91 | * | SIGPROF | terminate | | ||
92 | * | SIGPOLL/SIGIO | terminate | | ||
93 | * | SIGSYS/SIGUNUSED | coredump | | ||
94 | * | SIGSTKFLT | terminate | | ||
95 | * | SIGWINCH | ignore | | ||
96 | * | SIGPWR | terminate | | ||
97 | * | SIGRTMIN-SIGRTMAX | terminate | | ||
98 | * +--------------------+------------------+ | ||
99 | * | non-POSIX signal | default action | | ||
100 | * +--------------------+------------------+ | ||
101 | * | SIGEMT | coredump | | ||
102 | * +--------------------+------------------+ | ||
103 | * | ||
104 | * (+) For SIGKILL and SIGSTOP the action is "always", not just "default". | ||
105 | * (*) Special job control effects: | ||
106 | * When SIGCONT is sent, it resumes the process (all threads in the group) | ||
107 | * from TASK_STOPPED state and also clears any pending/queued stop signals | ||
108 | * (any of those marked with "stop(*)"). This happens regardless of blocking, | ||
109 | * catching, or ignoring SIGCONT. When any stop signal is sent, it clears | ||
110 | * any pending/queued SIGCONT signals; this happens regardless of blocking, | ||
111 | * catching, or ignored the stop signal, though (except for SIGSTOP) the | ||
112 | * default action of stopping the process may happen later or never. | ||
113 | */ | ||
114 | |||
115 | #ifdef SIGEMT | ||
116 | #define M_SIGEMT M(SIGEMT) | ||
117 | #else | ||
118 | #define M_SIGEMT 0 | ||
119 | #endif | ||
120 | |||
121 | #if SIGRTMIN > BITS_PER_LONG | ||
122 | #define M(sig) (1ULL << ((sig)-1)) | ||
123 | #else | ||
124 | #define M(sig) (1UL << ((sig)-1)) | ||
125 | #endif | ||
126 | #define T(sig, mask) (M(sig) & (mask)) | ||
127 | |||
128 | #define SIG_KERNEL_ONLY_MASK (\ | ||
129 | M(SIGKILL) | M(SIGSTOP) ) | ||
130 | |||
131 | #define SIG_KERNEL_STOP_MASK (\ | ||
132 | M(SIGSTOP) | M(SIGTSTP) | M(SIGTTIN) | M(SIGTTOU) ) | ||
133 | |||
134 | #define SIG_KERNEL_COREDUMP_MASK (\ | ||
135 | M(SIGQUIT) | M(SIGILL) | M(SIGTRAP) | M(SIGABRT) | \ | ||
136 | M(SIGFPE) | M(SIGSEGV) | M(SIGBUS) | M(SIGSYS) | \ | ||
137 | M(SIGXCPU) | M(SIGXFSZ) | M_SIGEMT ) | ||
138 | |||
139 | #define SIG_KERNEL_IGNORE_MASK (\ | ||
140 | M(SIGCONT) | M(SIGCHLD) | M(SIGWINCH) | M(SIGURG) ) | ||
141 | |||
142 | #define sig_kernel_only(sig) \ | ||
143 | (((sig) < SIGRTMIN) && T(sig, SIG_KERNEL_ONLY_MASK)) | ||
144 | #define sig_kernel_coredump(sig) \ | ||
145 | (((sig) < SIGRTMIN) && T(sig, SIG_KERNEL_COREDUMP_MASK)) | ||
146 | #define sig_kernel_ignore(sig) \ | ||
147 | (((sig) < SIGRTMIN) && T(sig, SIG_KERNEL_IGNORE_MASK)) | ||
148 | #define sig_kernel_stop(sig) \ | ||
149 | (((sig) < SIGRTMIN) && T(sig, SIG_KERNEL_STOP_MASK)) | ||
150 | |||
151 | #define sig_needs_tasklist(sig) ((sig) == SIGCONT) | ||
152 | |||
153 | #define sig_user_defined(t, signr) \ | ||
154 | (((t)->sighand->action[(signr)-1].sa.sa_handler != SIG_DFL) && \ | ||
155 | ((t)->sighand->action[(signr)-1].sa.sa_handler != SIG_IGN)) | ||
156 | |||
157 | #define sig_fatal(t, signr) \ | ||
158 | (!T(signr, SIG_KERNEL_IGNORE_MASK|SIG_KERNEL_STOP_MASK) && \ | ||
159 | (t)->sighand->action[(signr)-1].sa.sa_handler == SIG_DFL) | ||
160 | 41 | ||
161 | static int sig_ignored(struct task_struct *t, int sig) | 42 | static int sig_ignored(struct task_struct *t, int sig) |
162 | { | 43 | { |