pqsignal.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * pqsignal.c
  4.  *   reliable BSD-style signal(2) routine stolen from RWW who stole it
  5.  *   from Stevens...
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  *
  10.  * IDENTIFICATION
  11.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/libpq/pqsignal.c,v 1.11 1999/02/13 23:15:48 momjian Exp $
  12.  *
  13.  * NOTES
  14.  * This shouldn't be in libpq, but the monitor and some other
  15.  * things need it...
  16.  *
  17.  * A NOTE ABOUT SIGNAL HANDLING ACROSS THE VARIOUS PLATFORMS.
  18.  *
  19.  * config.h defines the macro USE_POSIX_SIGNALS for some platforms and
  20.  * not for others.  This file and pqsignal.h use that macro to decide
  21.  * how to handle signalling.
  22.  *
  23.  * signal(2) handling - this is here because it affects some of
  24.  * the frontend commands as well as the backend server.
  25.  *
  26.  * Ultrix and SunOS provide BSD signal(2) semantics by default.
  27.  *
  28.  * SVID2 and POSIX signal(2) semantics differ from BSD signal(2)
  29.  * semantics. We can use the POSIX sigaction(2) on systems that
  30.  * allow us to request restartable signals (SA_RESTART).
  31.  *
  32.  * Some systems don't allow restartable signals at all unless we
  33.  * link to a special BSD library.
  34.  *
  35.  * We devoutly hope that there aren't any systems that provide
  36.  * neither POSIX signals nor BSD signals. The alternative
  37.  * is to do signal-handler reinstallation, which doesn't work well
  38.  * at all.
  39.  * ------------------------------------------------------------------------*/
  40. #include <postgres.h>
  41. #include <signal.h>
  42. #include <libpq/pqsignal.h>
  43. pqsigfunc
  44. pqsignal(int signo, pqsigfunc func)
  45. {
  46. #if !defined(USE_POSIX_SIGNALS)
  47. return signal(signo, func);
  48. #else
  49. struct sigaction act,
  50. oact;
  51. act.sa_handler = func;
  52. sigemptyset(&act.sa_mask);
  53. act.sa_flags = 0;
  54. if (signo != SIGALRM)
  55. act.sa_flags |= SA_RESTART;
  56. if (sigaction(signo, &act, &oact) < 0)
  57. return SIG_ERR;
  58. return oact.sa_handler;
  59. #endif  /* !USE_POSIX_SIGNALS */
  60. }