VSF Documented
signal.h
Go to the documentation of this file.
1#ifndef __VSF_LINUX_SIGNAL_H__
2#define __VSF_LINUX_SIGNAL_H__
3
5
6#if VSF_LINUX_CFG_RELATIVE_PATH == ENABLED
7# include "./sys/types.h"
8#else
9# include <sys/types.h>
10#endif
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16#if VSF_LINUX_CFG_WRAPPER == ENABLED
17#define kill VSF_LINUX_WRAPPER(kill)
18#define signal VSF_LINUX_WRAPPER(signal)
19#define sigaction VSF_LINUX_WRAPPER(sigaction)
20#define sigprocmask VSF_LINUX_WRAPPER(sigprocmask)
21#define raise VSF_LINUX_WRAPPER(raise)
22
23#define sigemptyset VSF_LINUX_WRAPPER(sigemptyset)
24#define sigfillset VSF_LINUX_WRAPPER(sigfillset)
25#define sigaddsetmask VSF_LINUX_WRAPPER(sigaddsetmask)
26#define sigdelsetmask VSF_LINUX_WRAPPER(sigdelsetmask)
27#define sigtestsetmask VSF_LINUX_WRAPPER(sigtestsetmask)
28#define pthread_sigmask VSF_LINUX_WRAPPER(pthread_sigmask)
29#define sigwaitinfo VSF_LINUX_WRAPPER(sigwaitinfo)
30#define sigtimedwait VSF_LINUX_WRAPPER(sigtimedwait)
31#endif
32
33#if VSF_LINUX_CFG_SUPPORT_SIG == ENABLED
34#else
35#define sigjmp_buf jmp_buf
36#define siglongjmp(__j, __s)longjmp((__j), (__s))
37#define sigsetjmp(__j, __s) setjmp(__j)
38#endif
39
40typedef void (*sighandler_t)(int);
41typedef int sig_atomic_t;
42
43union sigval {
45 void *sival_ptr;
46};
47
48enum {
50#define SIGEV_SIGNAL SIGEV_SIGNAL
52#define SIGEV_NONE SIGEV_NONE
54#define SIGEV_THREAD SIGEV_THREAD
55};
56
57struct sigevent {
61
65};
66
67typedef struct {
74 int si_fd;
75} siginfo_t;
76
77#define SIGHUP 1 // hang up terminate
78#define SIGINT 2 // interrupt terminate
79#define SIGQUIT 3 // quit coredump
80#define SIGILL 4 // illeagle coredump
81#define SIGTRAP 5 // trap coredump
82#define SIGABRT 6 // abort coredump
83#define SIGIOT 6 // IO trap coredump
84#define SIGBUS 7 // bus error coredump
85#define SIGFPE 8 // float point error coredump
86#define SIGKILL 9 // kill terminate(unmaskable)
87#define SIGUSR1 10 // usr1 terminate
88#define SIGSEGV 11 // segment fault coredump
89#define SIGUSR2 12 // usr2 terminate
90#define SIGPIPE 13 // pipe error terminate
91#define SIGALRM 14 // alarm terminate
92#define SIGTERM 15 // terminate terminate
93#define SIGSTKFLT 16 // stack fault terminate
94#define SIGCHLD 17 // child ignore
95#define SIGCONT 18 // continue ignore
96#define SIGSTOP 19 // stop stop(unmaskable)
97#define SIGTSTP 20 // tty stop stop
98#define SIGTTIN 21 // tty in stop
99#define SIGTTOU 22 // tty out stop
100#define SIGURG 23 // ignore
101#define SIGXCPU 24 // coredump
102#define SIGXFSZ 25 // coredump
103#define SIGVTALRM 26 // terminate
104#define SIGPROF 27 // terminate
105// some applications will check SIGWINCH, undefine it to mark unsupported
106//#define SIGWINCH 28 // ignore
107#define SIGPOLL 20 // terminate
108#define SIGIO 29 // terminate
109#define SIGPWR 30 // terminate
110#define SIGSYS 31 // coredump
111#define SIGRTMIN 34
112#define SIGRTMAX 64
113#define NSIG 64
114#define _NSIG NSIG
115
116#define SIG_BLOCK 0
117#define SIG_UNBLOCK 1
118#define SIG_SETMASK 2
119
120#define SIG_DFL (sighandler_t)0
121#define SIG_IGN (sighandler_t)1
122#define SIG_ERR (sighandler_t)-1
123
124// sa_flags
125#define SA_NOCLDSTOP 1
126#define SA_NOCLDWAIT 2
127#define SA_SIGINFO 4
128#define SA_RESTART 0x10000000
129#define SA_NODEFER 0x40000000
130
131typedef struct {
132#if _NSIG >= 32
133 unsigned long long sig[_NSIG / (sizeof(unsigned long long) << 3)];
134#else
135 unsigned long sig[_NSIG / (sizeof(unsigned long) << 3)];
136#endif
137} sigset_t;
138
139struct sigaction {
140 union {
142 void (*sa_sigaction)(int, siginfo_t *, void *);
143 };
146 void (*sa_restorer)(void);
147};
148
149static inline int sigemptyset(sigset_t *set)
150{
151 set->sig[0] = 0;
152 return 0;
153}
154
155static inline int sigfillset(sigset_t *set)
156{
157 set->sig[0] = -1;
158 return 0;
159}
160
161static inline int sigaddset(sigset_t *set, int signo)
162{
163 set->sig[0] |= 1 << signo;
164 return 0;
165}
166
167static inline int sigdelset(sigset_t *set, int signo)
168{
169 set->sig[0] &= ~(1 << signo);
170 return 0;
171}
172
173static inline void sigaddsetmask(sigset_t *set, unsigned long mask)
174{
175 set->sig[0] |= mask;
176}
177
178static inline void sigdelsetmask(sigset_t *set, unsigned long mask)
179{
180 set->sig[0] &= ~mask;
181}
182
183static inline int sigtestsetmask(sigset_t *set, unsigned long mask)
184{
185 return (set->sig[0] & mask) != 0;
186}
187
188static inline int sigismember(const sigset_t *set, int signum)
189{
190 return sigtestsetmask((sigset_t *)set, 1ULL << signum);
191}
192
193static inline int sigisemptyset(sigset_t *set)
194{
195 return 0 == set->sig[0];
196}
197
198static inline int sigorset(sigset_t *dest, sigset_t *left, sigset_t *right)
199{
200 dest->sig[0] = left->sig[0] | right->sig[0];
201 return 0;
202}
203
204static inline int sigandset(sigset_t *dest, sigset_t *left, sigset_t *right)
205{
206 dest->sig[0] = left->sig[0] & right->sig[0];
207 return 0;
208}
209
210// ugly, but seems no choice, because:
211// 1. libc/time.h can not include timeval, so can not include sys/time.h,
212// or it will conflict with timeval in winsock.h
213// 2. signal.h can not include libc/time.h, because libc/time.h will include signal.h for sigevent
217};
218
219#if VSF_LINUX_APPLET_USE_SIGNAL == ENABLED
222
233# ifndef __VSF_APPLET__
235# endif
236#endif
237
238#if defined(__VSF_APPLET__) && (defined(__VSF_APPLET_LIB__) || defined(__VSF_APPLET_LINUX_SIGNAL_LIB__))\
239 && VSF_APPLET_CFG_ABI_PATCH != ENABLED && VSF_LINUX_APPLET_USE_SIGNAL == ENABLED
240
241#ifndef VSF_LINUX_APPLET_SIGNAL_VPLT
242# if VSF_LINUX_USE_APPLET == ENABLED
243# define VSF_LINUX_APPLET_SIGNAL_VPLT \
244 ((vsf_linux_signal_vplt_t *)(VSF_LINUX_APPLET_VPLT->signal_vplt))
245# else
246# define VSF_LINUX_APPLET_SIGNAL_VPLT \
247 ((vsf_linux_signal_vplt_t *)vsf_vplt((void *)0))
248# endif
249#endif
250
251#define VSF_LINUX_APPLET_SIGNAL_ENTRY(__NAME) \
252 VSF_APPLET_VPLT_ENTRY_FUNC_ENTRY(VSF_LINUX_APPLET_SIGNAL_VPLT, __NAME)
253#define VSF_LINUX_APPLET_SIGNAL_IMP(...) \
254 VSF_APPLET_VPLT_ENTRY_FUNC_IMP(VSF_LINUX_APPLET_SIGNAL_VPLT, __VA_ARGS__)
255
256VSF_LINUX_APPLET_SIGNAL_IMP(kill, int, pid_t pid, int sig) {
258 return VSF_LINUX_APPLET_SIGNAL_ENTRY(kill)(pid, sig);
259}
260VSF_LINUX_APPLET_SIGNAL_IMP(sigprocmask, int, int how, const sigset_t *set, sigset_t *oldset) {
262 return VSF_LINUX_APPLET_SIGNAL_ENTRY(sigprocmask)(how, set, oldset);
263}
264VSF_LINUX_APPLET_SIGNAL_IMP(signal, sighandler_t, int signum, sighandler_t handler) {
266 return VSF_LINUX_APPLET_SIGNAL_ENTRY(signal)(signum, handler);
267}
268VSF_LINUX_APPLET_SIGNAL_IMP(sigaction, int, int signum, const struct sigaction *act, struct sigaction *oldact) {
270 return VSF_LINUX_APPLET_SIGNAL_ENTRY(sigaction)(signum, act, oldact);
271}
272VSF_LINUX_APPLET_SIGNAL_IMP(raise, int, int sig) {
274 return VSF_LINUX_APPLET_SIGNAL_ENTRY(raise)(sig);
275}
276VSF_LINUX_APPLET_SIGNAL_IMP(pthread_sigmask, int, int how, const sigset_t *set, sigset_t *oldset) {
278 return VSF_LINUX_APPLET_SIGNAL_ENTRY(pthread_sigmask)(how, set, oldset);
279}
280VSF_LINUX_APPLET_SIGNAL_IMP(sigwaitinfo, int, const sigset_t *set, siginfo_t *info) {
282 return VSF_LINUX_APPLET_SIGNAL_ENTRY(sigwaitinfo)(set, info);
283}
284VSF_LINUX_APPLET_SIGNAL_IMP(sigtimedwait, int, const sigset_t *set, siginfo_t *info, const struct signal_timespec *timeout) {
286 return VSF_LINUX_APPLET_SIGNAL_ENTRY(sigtimedwait)(set, info, timeout);
287}
288VSF_LINUX_APPLET_SIGNAL_IMP(sigsuspend, int, const sigset_t *set) {
290 return VSF_LINUX_APPLET_SIGNAL_ENTRY(sigsuspend)(set);
291}
292
293#else // __VSF_APPLET__ && VSF_LINUX_APPLET_USE_SIGNAL
294
295int kill(pid_t pid, int sig);
296int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
297sighandler_t signal(int signum, sighandler_t handler);
298int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
299int raise(int sig);
300
301int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
302
303int sigwaitinfo(const sigset_t *set, siginfo_t *info);
304int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct signal_timespec *timeout);
305int sigsuspend(const sigset_t *set);
306
307#endif // __VSF_APPLET__ && VSF_LINUX_APPLET_USE_SIGNAL
308
309#ifdef __cplusplus
310}
311#endif
312
313#endif
__le16 timeout
Definition ieee80211.h:94
int pid_t
Definition types.h:85
unsigned int uid_t
Definition types.h:90
__TIME_T time_t
Definition types.h:122
#define SIGEV_SIGNAL
Definition signal.h:50
#define sigaddsetmask
Definition signal.h:25
#define sigfillset
Definition signal.h:24
#define _NSIG
Definition signal.h:114
#define SIGEV_THREAD
Definition signal.h:54
#define signal
Definition signal.h:18
#define sigdelsetmask
Definition signal.h:26
int sig_atomic_t
Definition signal.h:41
#define pthread_sigmask
Definition signal.h:28
int sigsuspend(const sigset_t *set)
Definition vsf_linux.c:2616
#define sigaction
Definition signal.h:19
void(* sighandler_t)(int)
Definition signal.h:40
#define sigprocmask
Definition signal.h:20
#define raise
Definition signal.h:21
#define sigtimedwait
Definition signal.h:30
#define sigtestsetmask
Definition signal.h:27
#define sigwaitinfo
Definition signal.h:29
__VSF_VPLT_DECORATOR__ vsf_linux_signal_vplt_t vsf_linux_signal_vplt
Definition vsf_linux.c:4867
#define sigemptyset
Definition signal.h:23
#define SIGEV_NONE
Definition signal.h:52
#define kill
Definition signal.h:17
Definition signal.h:139
sighandler_t sa_handler
Definition signal.h:141
sigset_t sa_mask
Definition signal.h:144
int sa_flags
Definition signal.h:145
Definition signal.h:57
void * sigev_notify_attributes
Definition signal.h:63
void(* sigev_notify_function)(union sigval)
Definition signal.h:62
int sigev_signo
Definition signal.h:59
union sigval sigev_value
Definition signal.h:60
int sigev_notify
Definition signal.h:58
pid_t sigev_notify_thread_id
Definition signal.h:64
Definition signal.h:67
int si_code
Definition signal.h:69
uid_t si_uid
Definition signal.h:71
int si_signo
Definition signal.h:68
pid_t si_pid
Definition signal.h:70
int si_status
Definition signal.h:73
int si_fd
Definition signal.h:74
int si_errno
Definition signal.h:72
Definition signal.h:214
long tv_nsec
Definition signal.h:216
time_t tv_sec
Definition signal.h:215
Definition signal.h:131
unsigned long sig[_NSIG/(sizeof(unsigned long)<< 3)]
Definition signal.h:135
Definition signal.h:220
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(sigwaitinfo)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(sigsuspend)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(sigprocmask)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(sigtimedwait)
vsf_vplt_info_t info
Definition signal.h:221
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(raise)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(signal)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(sigaction)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(pthread_sigmask)
Definition signal.h:43
void * sival_ptr
Definition signal.h:45
int sival_int
Definition signal.h:44
Definition vsf_cfg.h:95
#define __VSF_VPLT_DECORATOR__
Definition vsf_cfg.h:93
#define VSF_APPLET_VPLT_ENTRY_FUNC_TRACE()
Definition vsf_cfg.h:165
int sig
Definition vsf_thread.h:421