doc/src/howtos/unix-signal-handlers.qdoc
changeset 0 1918ee327afb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/src/howtos/unix-signal-handlers.qdoc	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+    \page unix-signals.html
+    \title Calling Qt Functions From Unix Signal Handlers
+    \brief You can't. But don't despair, there is a way...
+
+    \ingroup platform-specific
+    \ingroup best-practices
+
+    You \e can't call Qt functions from Unix signal handlers. The
+    standard POSIX rule applies: You can only call async-signal-safe
+    functions from signal handlers. See \l
+    {http://www.opengroup.org/onlinepubs/000095399/functions/xsh_chap02_04.html#tag_02_04_01}
+    {Signal Actions} for the complete list of functions you can call
+    from Unix signal handlers.
+
+    But don't despair, there is a way to use Unix signal handlers with
+    Qt. The strategy is to have your Unix signal handler do something
+    that will eventually cause a Qt signal to be emitted, and then you
+    simply return from your Unix signal handler. Back in your Qt
+    program, that Qt signal gets emitted and then received by your Qt
+    slot function, where you can safely do whatever Qt stuff you
+    weren't allowed to do in the Unix signal handler.
+
+    One simple way to make this happen is to declare a socket pair in
+    your class for each Unix signal you want to handle. The socket
+    pairs are declared as static data members. You also create a
+    QSocketNotifier to monitor the \e read end of each socket pair,
+    declare your Unix signal handlers to be static class methods, and
+    declare a slot function corresponding to each of your Unix signal
+    handlers. In this example, we intend to handle both the SIGHUP and
+    SIGTERM signals. Note: You should read the socketpair(2) and the
+    sigaction(2) man pages before plowing through the following code
+    snippets.
+    
+    \snippet doc/src/snippets/code/doc_src_unix-signal-handlers.qdoc 0
+
+    In the MyDaemon constructor, use the socketpair(2) function to
+    initialize each file descriptor pair, and then create the
+    QSocketNotifier to monitor the \e read end of each pair. The
+    activated() signal of each QSocketNotifier is connected to the
+    appropriate slot function, which effectively converts the Unix
+    signal to the QSocketNotifier::activated() signal.
+
+    \snippet doc/src/snippets/code/doc_src_unix-signal-handlers.qdoc 1
+
+    Somewhere else in your startup code, you install your Unix signal
+    handlers with sigaction(2).
+
+    \snippet doc/src/snippets/code/doc_src_unix-signal-handlers.qdoc 2
+
+    In your Unix signal handlers, you write a byte to the \e write end
+    of a socket pair and return. This will cause the corresponding
+    QSocketNotifier to emit its activated() signal, which will in turn
+    cause the appropriate Qt slott function to run.
+
+    \snippet doc/src/snippets/code/doc_src_unix-signal-handlers.qdoc 3
+
+    In the slot functions connected to the
+    QSocketNotifier::activated() signals, you \e read the byte. Now
+    you are safely back in Qt with your signal, and you can do all the
+    Qt stuff you weren'tr allowed to do in the Unix signal handler.
+
+    \snippet doc/src/snippets/code/doc_src_unix-signal-handlers.qdoc 4
+*/