signal.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _LINUX_SIGNAL_H
  2. #define _LINUX_SIGNAL_H
  3. #include <asm/signal.h>
  4. #include <asm/siginfo.h>
  5. #ifdef __KERNEL__
  6. /*
  7.  * Real Time signals may be queued.
  8.  */
  9. struct sigqueue {
  10. struct sigqueue *next;
  11. siginfo_t info;
  12. };
  13. struct sigpending {
  14. struct sigqueue *head, **tail;
  15. sigset_t signal;
  16. };
  17. /*
  18.  * Define some primitives to manipulate sigset_t.
  19.  */
  20. #ifndef __HAVE_ARCH_SIG_BITOPS
  21. #include <asm/bitops.h>
  22. /* We don't use <asm/bitops.h> for these because there is no need to
  23.    be atomic.  */
  24. static inline void sigaddset(sigset_t *set, int _sig)
  25. {
  26. unsigned long sig = _sig - 1;
  27. if (_NSIG_WORDS == 1)
  28. set->sig[0] |= 1UL << sig;
  29. else
  30. set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW);
  31. }
  32. static inline void sigdelset(sigset_t *set, int _sig)
  33. {
  34. unsigned long sig = _sig - 1;
  35. if (_NSIG_WORDS == 1)
  36. set->sig[0] &= ~(1UL << sig);
  37. else
  38. set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW));
  39. }
  40. static inline int sigismember(sigset_t *set, int _sig)
  41. {
  42. unsigned long sig = _sig - 1;
  43. if (_NSIG_WORDS == 1)
  44. return 1 & (set->sig[0] >> sig);
  45. else
  46. return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
  47. }
  48. static inline int sigfindinword(unsigned long word)
  49. {
  50. return ffz(~word);
  51. }
  52. #define sigmask(sig) (1UL << ((sig) - 1))
  53. #endif /* __HAVE_ARCH_SIG_BITOPS */
  54. #ifndef __HAVE_ARCH_SIG_SETOPS
  55. #include <linux/string.h>
  56. #define _SIG_SET_BINOP(name, op)
  57. static inline void name(sigset_t *r, const sigset_t *a, const sigset_t *b) 
  58. {
  59. unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
  60. unsigned long i;
  61. for (i = 0; i < _NSIG_WORDS/4; ++i) {
  62. a0 = a->sig[4*i+0]; a1 = a->sig[4*i+1];
  63. a2 = a->sig[4*i+2]; a3 = a->sig[4*i+3];
  64. b0 = b->sig[4*i+0]; b1 = b->sig[4*i+1];
  65. b2 = b->sig[4*i+2]; b3 = b->sig[4*i+3];
  66. r->sig[4*i+0] = op(a0, b0);
  67. r->sig[4*i+1] = op(a1, b1);
  68. r->sig[4*i+2] = op(a2, b2);
  69. r->sig[4*i+3] = op(a3, b3);
  70. }
  71. switch (_NSIG_WORDS % 4) {
  72.     case 3:
  73. a0 = a->sig[4*i+0]; a1 = a->sig[4*i+1]; a2 = a->sig[4*i+2]; 
  74. b0 = b->sig[4*i+0]; b1 = b->sig[4*i+1]; b2 = b->sig[4*i+2]; 
  75. r->sig[4*i+0] = op(a0, b0);
  76. r->sig[4*i+1] = op(a1, b1);
  77. r->sig[4*i+2] = op(a2, b2);
  78. break;
  79.     case 2:
  80. a0 = a->sig[4*i+0]; a1 = a->sig[4*i+1];
  81. b0 = b->sig[4*i+0]; b1 = b->sig[4*i+1];
  82. r->sig[4*i+0] = op(a0, b0);
  83. r->sig[4*i+1] = op(a1, b1);
  84. break;
  85.     case 1:
  86. a0 = a->sig[4*i+0]; b0 = b->sig[4*i+0];
  87. r->sig[4*i+0] = op(a0, b0);
  88. break;
  89. }
  90. }
  91. #define _sig_or(x,y) ((x) | (y))
  92. _SIG_SET_BINOP(sigorsets, _sig_or)
  93. #define _sig_and(x,y) ((x) & (y))
  94. _SIG_SET_BINOP(sigandsets, _sig_and)
  95. #define _sig_nand(x,y) ((x) & ~(y))
  96. _SIG_SET_BINOP(signandsets, _sig_nand)
  97. #undef _SIG_SET_BINOP
  98. #undef _sig_or
  99. #undef _sig_and
  100. #undef _sig_nand
  101. #define _SIG_SET_OP(name, op)
  102. static inline void name(sigset_t *set)
  103. {
  104. unsigned long i;
  105. for (i = 0; i < _NSIG_WORDS/4; ++i) {
  106. set->sig[4*i+0] = op(set->sig[4*i+0]);
  107. set->sig[4*i+1] = op(set->sig[4*i+1]);
  108. set->sig[4*i+2] = op(set->sig[4*i+2]);
  109. set->sig[4*i+3] = op(set->sig[4*i+3]);
  110. }
  111. switch (_NSIG_WORDS % 4) {
  112.     case 3: set->sig[4*i+2] = op(set->sig[4*i+2]);
  113.     case 2: set->sig[4*i+1] = op(set->sig[4*i+1]);
  114.     case 1: set->sig[4*i+0] = op(set->sig[4*i+0]);
  115. }
  116. }
  117. #define _sig_not(x) (~(x))
  118. _SIG_SET_OP(signotset, _sig_not)
  119. #undef _SIG_SET_OP
  120. #undef _sig_not
  121. static inline void sigemptyset(sigset_t *set)
  122. {
  123. switch (_NSIG_WORDS) {
  124. default:
  125. memset(set, 0, sizeof(sigset_t));
  126. break;
  127. case 2: set->sig[1] = 0;
  128. case 1: set->sig[0] = 0;
  129. break;
  130. }
  131. }
  132. static inline void sigfillset(sigset_t *set)
  133. {
  134. switch (_NSIG_WORDS) {
  135. default:
  136. memset(set, -1, sizeof(sigset_t));
  137. break;
  138. case 2: set->sig[1] = -1;
  139. case 1: set->sig[0] = -1;
  140. break;
  141. }
  142. }
  143. extern char * render_sigset_t(sigset_t *set, char *buffer);
  144. /* Some extensions for manipulating the low 32 signals in particular.  */
  145. static inline void sigaddsetmask(sigset_t *set, unsigned long mask)
  146. {
  147. set->sig[0] |= mask;
  148. }
  149. static inline void sigdelsetmask(sigset_t *set, unsigned long mask)
  150. {
  151. set->sig[0] &= ~mask;
  152. }
  153. static inline int sigtestsetmask(sigset_t *set, unsigned long mask)
  154. {
  155. return (set->sig[0] & mask) != 0;
  156. }
  157. static inline void siginitset(sigset_t *set, unsigned long mask)
  158. {
  159. set->sig[0] = mask;
  160. switch (_NSIG_WORDS) {
  161. default:
  162. memset(&set->sig[1], 0, sizeof(long)*(_NSIG_WORDS-1));
  163. break;
  164. case 2: set->sig[1] = 0;
  165. case 1: ;
  166. }
  167. }
  168. static inline void siginitsetinv(sigset_t *set, unsigned long mask)
  169. {
  170. set->sig[0] = ~mask;
  171. switch (_NSIG_WORDS) {
  172. default:
  173. memset(&set->sig[1], -1, sizeof(long)*(_NSIG_WORDS-1));
  174. break;
  175. case 2: set->sig[1] = -1;
  176. case 1: ;
  177. }
  178. }
  179. #endif /* __HAVE_ARCH_SIG_SETOPS */
  180. static inline void init_sigpending(struct sigpending *sig)
  181. {
  182. sigemptyset(&sig->signal);
  183. sig->head = NULL;
  184. sig->tail = &sig->head;
  185. }
  186. extern long do_sigpending(void *, unsigned long);
  187. #endif /* __KERNEL__ */
  188. #endif /* _LINUX_SIGNAL_H */