home *** CD-ROM | disk | FTP | other *** search
/ RISCWORLD 7 / RISCWORLD_VOL7.iso / Software / Issue2 / SDL.ARC / !unixlib / source / clib / h / signal < prev    next >
Encoding:
Text File  |  2004-09-06  |  9.2 KB  |  343 lines

  1. /****************************************************************************
  2.  *
  3.  * $Source: /usr/local/cvsroot/gccsdk/unixlib/source/clib/signal.h,v $
  4.  * $Date: 2004/08/16 21:01:26 $
  5.  * $Revision: 1.9 $
  6.  * $State: Exp $
  7.  * $Author: joty $
  8.  *
  9.  ***************************************************************************/
  10.  
  11. /* ANSI, POSIX and BSD signal handling.  */
  12.  
  13. #ifndef __SIGNAL_H
  14. #define __SIGNAL_H
  15.  
  16. #ifndef __UNIXLIB_FEATURES_H
  17. #include <unixlib/features.h>
  18. #endif
  19.  
  20. #ifndef __UNIXLIB_TYPES_H
  21. #include <unixlib/types.h>
  22. #endif
  23. #ifndef __STDDEF_H
  24. #include <stddef.h>
  25. #endif
  26.  
  27. #define __need_pthread_t
  28. #include <pthread.h>
  29.  
  30. __BEGIN_DECLS
  31.  
  32. /* Keep the following in sync with asm_dec.s. */
  33. /* Hangup (POSIX).  */
  34. #define SIGHUP        1
  35. /* Interrupt (ANSI).  */
  36. #define SIGINT        2
  37. /* Quit (POSIX).  */
  38. #define SIGQUIT        3
  39. /* Illegal instruction (ANSI).  */
  40. #define SIGILL        4
  41. /* Abort (ANSI).  */
  42. #define SIGABRT        SIGIOT
  43. /* Trace trap (POSIX).  */
  44. #define SIGTRAP        5
  45. /* IOT trap (4.2 BSD).  */
  46. #define SIGIOT        6
  47. /* EMT trap (4.2 BSD).  */
  48. #define SIGEMT        7
  49. /* Floating-point exception (ANSI).  */
  50. #define SIGFPE        8
  51. /* Kill, unblockable (POSIX).  */
  52. #define SIGKILL        9
  53. /* Bus error (4.2 BSD).  */
  54. #define SIGBUS        10
  55. /* Segmentation violation (ANSI).  */
  56. #define SIGSEGV        11
  57. /* Bad argument to system call (4.2 BSD).  */
  58. #define SIGSYS        12
  59. /* Broken pipe (POSIX).  */
  60. #define SIGPIPE        13
  61. /* Alarm clock (POSIX).  */
  62. #define SIGALRM        14
  63. /* Termination (ANSI).  */
  64. #define SIGTERM        15
  65. /* Urgent, or out-of-band data arrives on a socket (4.2 BSD). */
  66. #define SIGURG        16
  67. /* Stop, unblockable (POSIX).  */
  68. #define SIGSTOP        17
  69. /* Keyboard stop, Ctrl-Z (POSIX).  */
  70. #define SIGTSTP        18
  71. /* Continue (POSIX).  */
  72. #define SIGCONT        19
  73. /* Child process has terminated or stopped (POSIX).  */
  74. #define SIGCHLD        20
  75. /* Obsolete name for SIGCHLD (System V).  */
  76. #define SIGCLD        SIGCHLD
  77. /* Background read from tty (POSIX).  */
  78. #define SIGTTIN        21
  79. /* Backgroung write to tty (POSIX).  */
  80. #define SIGTTOU        22
  81. /* File descriptor is ready to perform input or output (4.2 BSD).  */
  82. #define SIGIO        23
  83. /* Similar to SIGIO (System V). */
  84. #define SIGPOLL        SIGIO
  85. /* CPU time limit exceeded (4.2 BSD).  */
  86. #define SIGXCPU        24
  87. /* File size limit exceeded (4.2 BSD).  */
  88. #define SIGXFSZ        25
  89. /* Virtual alarm clock (4.2 BSD).  */
  90. #define SIGVTALRM    26
  91. /* Profiling alarm clock (4.2 BSD).  */
  92. #define SIGPROF        27
  93. /* Window size change (4.3 BSD)  */
  94. #define SIGWINCH    28
  95. /* Information request (4.4 BSD). */
  96. #define SIGINFO        29
  97. /* User-defined signal 1 (POSIX).  */
  98. #define SIGUSR1        30
  99. /* User-defined signal 2 (POSIX).  */
  100. #define SIGUSR2        31
  101. /* Resource lost.  */
  102. #define SIGLOST        32
  103. /* RISC OS error.  */
  104. #define SIGOSERROR    33
  105.  
  106. /* Total number of signals defined. This should be one greater than
  107.    the largest defined signal number.  */
  108. #define _NSIG 34
  109. #define NSIG _NSIG
  110.  
  111. /* Type of a signal handler.  */
  112. typedef void (*__sighandler_t)(int);
  113. #ifdef __USE_GNU
  114. typedef __sighandler_t sighandler_t;
  115. #endif
  116.  
  117. extern int sys_nsig;        /* = NSIG */
  118. extern const char * const sys_siglist[NSIG];    /* signal messages */
  119.  
  120. /* Fake signal functions, based on the BSD versions.  */
  121.  
  122. /* Error return.  */
  123. #define SIG_ERR ((__sighandler_t) -1)
  124.  
  125. /* Default action.  */
  126. #define SIG_DFL ((__sighandler_t) 0)
  127.  
  128. /* Ignore signal.  */
  129. #define SIG_IGN ((__sighandler_t) 1)
  130.  
  131. extern __sighandler_t signal (int __sig, __sighandler_t __handler) __THROW;
  132.  
  133. /* Send signal 'sig' to process number 'pid'.  If pid is zero,
  134.    send sig to all processes in the current process's process group.
  135.    If pid is < -1, send sig to all processes in process group -pid.  */
  136. extern int kill (__pid_t __pid, int __sig) __THROW;
  137.  
  138. /* Send signal 'sig' to all processes in process group 'pgrp'.
  139.    If pgrp is zero, send sig to all processes in the current
  140.    process's process group.  */
  141. extern int killpg (__pid_t __pgrp, int __sig) __THROW;
  142.  
  143. /* Raise signal sig.  */
  144. extern int raise (int __sig) __THROW;
  145.  
  146. /* Print a message describing the meaning of the given signal number.  */
  147. extern void psignal (int __sig, const char *__s) __THROW;
  148.  
  149.  
  150. /* BSD signal functions.  */
  151.  
  152. /* Block signals in mask, returning the old mask.  */
  153. extern int sigblock (int __mask) __THROW;
  154.  
  155. /* Set the mask of blocked signals to mask, return the old mask.  */
  156. extern int sigsetmask (int __mask) __THROW;
  157.  
  158. /* Set the mask of blocked signals to mask, wait for a signal
  159.    to arrive, and then restore the mask.  */
  160. extern int sigpause (int __mask) __THROW;
  161.  
  162. #define sig_atomic_t __sig_atomic_t
  163.  
  164. /* POSIX signal functions.  */
  165.  
  166. /* Don't rely on sigset_t remaining an unsigned long. It's usage
  167.    could soon change into the structure form below. Use the
  168.    signal functions below to manipulate its value.  */
  169.  
  170. #define sigset_t __sigset_t
  171.  
  172. #if 0
  173. typedef struct __usigset
  174. {
  175.   unsigned int sig[NSIG] : 1;
  176. } __sigset_t;
  177. #endif
  178.  
  179. /* Structure describing the action to be taken when a signal arrives.  */
  180. struct sigaction
  181.   {
  182.     /* Signal handler.  */
  183.     __sighandler_t sa_handler;
  184.     /* Additional set of signals to be blocked.  */
  185.     __sigset_t sa_mask;
  186.     /* Special flags.  */
  187.     int sa_flags;
  188.   };
  189.  
  190. /* Bits in sa_flags.  */
  191.  
  192. /* Take signal on signal stack.  */
  193. #define    SA_ONSTACK    0x1
  194. /* Don't restart syscall on signal return.  */
  195. #define    SA_RESTART    0x2
  196. /* Disable alternate signal stack.  */
  197. #define    SA_DISABLE    0x4
  198. /* Don't send SIGCHLD when children stop.  */
  199. #define    SA_NOCLDSTOP    0x8
  200.  
  201.  
  202. /* Values for the HOW argument to `sigprocmask'.  */
  203.  
  204. /* Block signals.  */
  205. #define    SIG_BLOCK    1
  206. /* Unblock signals.  */
  207. #define    SIG_UNBLOCK    2
  208. /* Set the set of blocked signals.  */
  209. #define    SIG_SETMASK    3
  210.  
  211. /* Currently in an optimised state but this could soon change.  */
  212.  
  213. /* Clear all signals from set.  */
  214. extern int sigemptyset (__sigset_t *__set) __THROW;
  215. #define sigemptyset(set) ((*(set) = (__sigset_t) 0), 0)
  216.  
  217. /* Set all signals in set.  */
  218. extern int sigfillset (__sigset_t *__set) __THROW;
  219. #define sigfillset(set) ((*(set) = ~(__sigset_t) 0), 0)
  220.  
  221. extern __sigset_t sigmask (int __sig) __THROW;
  222. #define sigmask(sig) (((__sigset_t) 1) << ((sig) - 1))
  223.  
  224.  
  225. /* Add signo to set.  */
  226. extern int sigaddset (__sigset_t *__set, int __signo) __THROW;
  227.  
  228. /* Remove signo from set.  */
  229. extern int sigdelset (__sigset_t *__set, int __signo) __THROW;
  230.  
  231. /* Remove 1 if signo is in set, 0 if not.  */
  232. extern int sigismember (const __sigset_t *__set, int __signo) __THROW;
  233.  
  234. #ifdef __UNIXLIB_INTERNALS
  235. /* Inline versions for UnixLib library only. These are subject to change.  */
  236.  
  237. /* Add signo to set.  */
  238. #define sigaddset(set,signo) ((*(set) |= sigmask (signo)), 0)
  239.  
  240. /* Remove signo from set.  */
  241. #define sigdelset(set,signo) ((*(set) &= ~sigmask (signo)), 0)
  242.  
  243. /* Remove 1 if signo is in set, 0 if not.  */
  244. #define sigismember(set,signo) ((*(set) & sigmask (signo)) ? 1 : 0)
  245.  
  246. #endif  /* __UNIXLIB_INTERNALS */
  247.  
  248. /* Get and/or change the set of blocked signals.  */
  249. extern int sigprocmask (int __how, const __sigset_t *__restrict __set,
  250.             __sigset_t *__oldset) __THROW;
  251.  
  252. /* Change the set of blocked signals,
  253.    wait until a signal arrives, and restore the set of blocked signals.  */
  254. extern int sigsuspend (const __sigset_t *__set) __THROW;
  255.  
  256. /* Get and/or set the action for signal sig.  */
  257. extern int sigaction (int __sig, const struct sigaction *__restrict __act,
  258.               struct sigaction *__oldact) __THROW;
  259.  
  260. /* Put in set all signals that are blocked and waiting to be delivered.  */
  261. extern int sigpending (__sigset_t *__set) __THROW;
  262.  
  263. /* BSD signal handling functionality.  */
  264. #if 0
  265. struct sigvec
  266. {
  267.   /* Signal handler.  */
  268.   sighandler_t sv_handler;
  269.   /* Mask of signals to be blocked.  */
  270.   int sv_mask;
  271.   /* Flags.  */
  272.   int sv_flags;
  273. /* 4.2 BSD compatibility.  */
  274. #define sv_onstack sv_flags
  275. };
  276.  
  277. /* Bits in sv_flags.  */
  278.  
  279. /* Take the signal on the signal stack. */
  280. #define SV_ONSTACK 1
  281. /* Do not restart system calls.  */
  282. #define SV_INTERRUPT 2
  283. /* Reset handler to SIG_DFL on receipt.  */
  284. #define SV_RESETHAND 4
  285.  
  286. extern int sigvec (int __sig, const struct sigvec *__vec,
  287.            struct sigvec *__ovec) __THROW;
  288.  
  289. /* If interrupt is nonzero, make signal sig interrupt system calls
  290.    (causing them to fail with EINTR); if interrupt is zero, make
  291.    system calls be restarted after signal sig.  */
  292. extern int siginterrupt (int __sig, int __interrupt) __THROW;
  293. #endif
  294.  
  295. /* Signal stack structure (BSD style).  */
  296. struct sigstack
  297.   {
  298.     /* Signal stack pointer.  */
  299.     void *ss_sp;
  300.     /* Non zero if executing on this stack.  */
  301.     int ss_onstack;
  302.   };
  303.  
  304. /* Run signal handlers on the stack specified by 'ss' (if not NULL).
  305.    The old status is returned in oss (if not NULL).  */
  306. extern int sigstack (const struct sigstack *__ss,
  307.              struct sigstack *__oss) __THROW;
  308.  
  309. /* Signal stack structure (POSIX alternative interface).  */
  310. struct sigaltstack
  311.   {
  312.     /* Pointer to stack base.  */
  313.     void *ss_sp;
  314.     /* Size of stack.  */
  315.     size_t ss_size;
  316.     /* sigaltstack flags.  */
  317.     int ss_flags;
  318.   };
  319.  
  320. extern int sigaltstack (const struct sigaltstack *__ss,
  321.             struct sigaltstack *__oss) __THROW;
  322.  
  323. /* Signal stack constants.  */
  324.  
  325. /* The recommended signal stack size for a signal handler.  */
  326. #define SIGSTKSZ 4096
  327.  
  328. /* The absolute safe minimum signal stack size
  329.    for running signal handlers in.  */
  330.  
  331. #define MINSIGSTKSZ 2048
  332.  
  333. /* Send a signal to a specific thread */
  334. extern int pthread_kill (pthread_t thread, int sig) __THROW;
  335.  
  336. /* Set the signal mask for a thread */
  337. extern int pthread_sigmask (int how, const sigset_t *set,
  338.                 sigset_t *oset) __THROW;
  339.  
  340. __END_DECLS
  341.  
  342. #endif
  343.