a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This code is free software; you can redistribute it and/or modify it
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * under the terms of the GNU General Public License version 2 only, as
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * published by the Free Software Foundation. Oracle designates this
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * particular file as subject to the "Classpath" exception as provided
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * by Oracle in the LICENSE file that accompanied this code.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This code is distributed in the hope that it will be useful, but WITHOUT
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * version 2 for more details (a copy is included in the LICENSE file that
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * accompanied this code).
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You should have received a copy of the GNU General Public License version
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * 2 along with this work; if not, write to the Free Software Foundation,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * or visit www.oracle.com if you need additional information or have any
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * questions.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This class provides ANSI/ISO C signal support. A Java program can register
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * signal handlers for the current process. There are two restrictions:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Java code cannot register a handler for signals that are already used
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * by the Java VM implementation. The <code>Signal.handle</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * function raises an <code>IllegalArgumentException</code> if such an attempt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When <code>Signal.handle</code> is called, the VM internally registers a
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * special C signal handler. There is no way to force the Java signal handler
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * to run synchronously before the C signal handler returns. Instead, when the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * VM receives a signal, the special C signal handler creates a new thread
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (at priority <code>Thread.MAX_PRIORITY</code>) to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * run the registered Java signal handler. The C signal handler immediately
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * returns. Note that because the Java signal handler runs in a newly created
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * thread, it may not actually be executed until some time after the C signal
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * handler returns.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Signal objects are created based on their names. For example:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <blockquote><pre>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * new Signal("INT");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * </blockquote></pre>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * constructs a signal object corresponding to <code>SIGINT</code>, which is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * typically produced when the user presses <code>Ctrl-C</code> at the command line.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The <code>Signal</code> constructor throws <code>IllegalArgumentException</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * when it is passed an unknown signal.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This is an example of how Java code handles <code>SIGINT</code>:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <blockquote><pre>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * SignalHandler handler = new SignalHandler () {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * public void handle(Signal sig) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * ... // handle SIGINT
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Signal.handle(new Signal("INT"), handler);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * </blockquote></pre>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @author Sheng Liang
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @author Bill Shannon
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @see sun.misc.SignalHandler
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @since 1.2
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static Hashtable handlers = new Hashtable(4);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static Hashtable signals = new Hashtable(4);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* Returns the signal number */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the signal name.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the name of the signal.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @see sun.misc.Signal#Signal(String name)
if (this == other) {
return number;
throws IllegalArgumentException {
throw new IllegalArgumentException
synchronized (handlers) {
return oldHandler;
public void run() {