posix-next API 0.1.0
Out-of-tree Zephyr POSIX module
Loading...
Searching...
No Matches
posix_signal.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2025 The Zephyr Contributors
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
19#ifndef ZEPHYR_INCLUDE_POSIX_POSIX_SIGNAL_H_
20#define ZEPHYR_INCLUDE_POSIX_POSIX_SIGNAL_H_
21
22#if defined(_POSIX_C_SOURCE) || defined(__DOXYGEN__)
23
24#include <zephyr/toolchain.h>
25#include <zephyr/sys/util.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31/* SIG_DFL must be defined by the libc signal.h */
32/* SIG_ERR must be defined by the libc signal.h */
33
34#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
36#define SIG_HOLD ((void *)-2)
37#endif
38
39/* SIG_IGN must be defined by the libc signal.h */
40
41#if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
42
43#if !defined(_PTHREAD_T_DECLARED) && !defined(__pthread_t_defined)
44typedef unsigned int pthread_t;
45#define _PTHREAD_T_DECLARED
46#define __pthread_t_defined
47#endif
48
49#endif /* defined(_POSIX_THREADS) || defined(__DOXYGEN__) */
50
51/* size_t must be defined by the libc stddef.h */
52#include <stddef.h>
53
54#if !defined(_UID_T_DECLARED) && !defined(__uid_t_defined)
55typedef int uid_t;
56#define _UID_T_DECLARED
57#define __uid_t_defined
58#endif
59
60/* time_t must be defined by the libc time.h */
61#include <time.h>
62
63#if __STDC_VERSION__ >= 201112L
64/* struct timespec must be defined in the libc time.h */
65#else
66#if !defined(_TIMESPEC_DECLARED) && !defined(__timespec_defined)
67struct timespec {
68 time_t tv_sec;
69 long tv_nsec;
70};
71#define _TIMESPEC_DECLARED
72#define __timespec_defined
73#endif
74#endif
75
76/* sig_atomic_t must be defined by the libc signal.h */
77
78#define SIGRTMIN 32
79#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
80BUILD_ASSERT(CONFIG_POSIX_RTSIG_MAX >= 0);
81#define SIGRTMAX (SIGRTMIN + CONFIG_POSIX_RTSIG_MAX)
82#else
83#define SIGRTMAX SIGRTMIN
84#endif
85
86#if !defined(_SIGSET_T_DECLARED) && !defined(__sigset_t_defined)
88typedef struct {
89 unsigned long sig[DIV_ROUND_UP(SIGRTMAX, BITS_PER_LONG)];
90} sigset_t;
91#define _SIGSET_T_DECLARED
92#define __sigset_t_defined
93#endif
94
95#if !defined(_PID_T_DECLARED) && !defined(__pid_t_defined)
96typedef long pid_t;
97#define _PID_T_DECLARED
98#define __pid_t_defined
99#endif
100
101#if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
102
103#if !defined(_PTHREAD_ATTR_T_DECLARED) && !defined(__pthread_attr_t_defined)
104typedef struct {
105 void *stack;
106 unsigned int details[2];
108#define _PTHREAD_ATTR_T_DECLARED
109#define __pthread_attr_t_defined
110#endif
111
112#endif
113
114#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
115
116/* slightly out of order w.r.t. the specification */
117#if !defined(_SIGVAL_DECLARED) && !defined(__sigval_defined)
119union sigval {
121 void *sival_ptr;
122};
123#define _SIGVAL_DECLARED
124#define __sigval_defined
125#endif
126
127#if !defined(_SIGEVENT_DECLARED) && !defined(__sigevent_defined)
129struct sigevent {
130#if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
132 void (*sigev_notify_function)(union sigval value);
133#endif
137};
138#define _SIGEVENT_DECLARED
139#define __sigevent_defined
140#endif
141
143#define SIGEV_NONE 1
145#define SIGEV_SIGNAL 2
147#define SIGEV_THREAD 3
148
149/* Signal constants are defined below */
150
151#endif /* defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__) */
152
153/* SIGRTMIN and SIGRTMAX defined above */
154
155/* slightly out of order w.r.t. the specification */
156#if !defined(_SIGINFO_T_DECLARED) && !defined(__siginfo_t_defined)
158typedef struct {
159 void *si_addr;
160#if defined(_XOPEN_STREAMS) || defined(__DOXYGEN__)
161 long si_band;
162#endif
163 union sigval si_value;
164 pid_t si_pid;
165 uid_t si_uid;
168#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
170#endif
172} siginfo_t;
173#define _SIGINFO_T_DECLARED
174#define __siginfo_t_defined
175#endif
176
177#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
178
179#if !defined(_SIGACTION_DECLARED) && !defined(__sigaction_defined)
181struct sigaction {
182 union {
183 void (*sa_handler)(int sig);
184 void (*sa_sigaction)(int sig, siginfo_t *info, void *context);
185 };
188};
189#define _SIGACTION_DECLARED
190#define __sigaction_defined
191#endif
192
194#define SIG_BLOCK 1
196#define SIG_UNBLOCK 2
198#define SIG_SETMASK 0
199
200#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
202#define SA_NOCLDSTOP 0x00000001
204#define SA_ONSTACK 0x00000002
205#endif
207#define SA_RESETHAND 0x00000004
209#define SA_RESTART 0x00000008
211#define SA_SIGINFO 0x00000010
212#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
214#define SA_NOCLDWAIT 0x00000020
215#endif
217#define SA_NODEFER 0x00000040
219#define SS_ONSTACK 0x00000001
221#define SS_DISABLE 0x00000002
223#define MINSIGSTKSZ 4096
225#define SIGSTKSZ 4096
226
227#if !defined(_MCONTEXT_T_DECLARED) && !defined(__mcontext_t_defined)
229typedef struct {
230 /* FIXME: there should be a much better Zephyr-specific structure that can be used here */
231 unsigned long gregs[32];
232 unsigned long flags;
233} mcontext_t;
234#define _MCONTEXT_T_DECLARED
235#define __mcontext_defined
236#endif
237
238/* slightly out of order w.r.t. the specification */
239#if !defined(_STACK_T_DECLARED) && !defined(__stack_t_defined)
241typedef struct {
242 void *ss_sp;
243 size_t ss_size;
245} stack_t;
246#define _STACK_T_DECLARED
247#define __stack_t_defined
248#endif
249
250#if !defined(_UCONTEXT_T_DECLARED) && !defined(__ucontext_t_defined)
258#define _UCONTEXT_T_DECLARED
259#define __ucontext_defined
260#endif
261
262#endif /* defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__) */
263
264/* Siginfo codes are defined below */
265
266#if !defined(_SIGHANDLER_T_DECLARED) && !defined(__sighandler_t_defined)
268typedef void (*sighandler_t)(int sig);
269#define _SIGHANDLER_T_DECLARED
270#define __sighandler_t_defined
271#endif
272
281int kill(pid_t pid, int sig);
282
283#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
292int killpg(pid_t pgrp, int sig);
293#endif
294
302void psiginfo(const siginfo_t *info, const char *message);
303
311void psignal(int sig, const char *message);
312
313#if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
322int pthread_kill(pthread_t thread, int sig);
323
333int pthread_sigmask(int how, const sigset_t *ZRESTRICT set, sigset_t *ZRESTRICT oset);
334#endif
335
336#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
337TOOLCHAIN_DISABLE_WARNING(TOOLCHAIN_WARNING_SHADOW);
347int sigaction(int sig, const struct sigaction *ZRESTRICT act, struct sigaction *ZRESTRICT oact);
348TOOLCHAIN_ENABLE_WARNING(TOOLCHAIN_WARNING_SHADOW);
349#endif
350
359int sigaddset(sigset_t *set, int sig);
360
361#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
370int sigaltstack(const stack_t *ZRESTRICT ss, stack_t *ZRESTRICT oss);
371#endif
372
381int sigdelset(sigset_t *set, int sig);
382
391
400
401#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
409int sighold(int sig);
410
418int sigignore(int sig);
419
428int siginterrupt(int sig, int flag);
429#endif
430
439int sigismember(const sigset_t *set, int sig);
440
441#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
449int sigpause(int sig);
450#endif
451
460
470int sigprocmask(int how, const sigset_t *ZRESTRICT set, sigset_t *ZRESTRICT oset);
471
472#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
482int sigqueue(pid_t pid, int sig, union sigval value);
483#endif
484
485#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
493int sigrelse(int sig);
494
504#endif
505
513int sigsuspend(const sigset_t *set);
514
515#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
525int sigtimedwait(const sigset_t *ZRESTRICT set, siginfo_t *ZRESTRICT info,
526 const struct timespec *ZRESTRICT timeout);
527#endif
528
537int sigwait(const sigset_t *ZRESTRICT set, int *ZRESTRICT sig);
538
539#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
548int sigwaitinfo(const sigset_t *ZRESTRICT set, siginfo_t *ZRESTRICT info);
549#endif
550
551/* Note: only ANSI / ISO C signals are guarded below */
552
553#define SIGHUP 1
554#if !defined(SIGINT) || defined(__DOXYGEN__)
555#define SIGINT 2
556#endif
557#define SIGQUIT 3
558#if !defined(SIGILL) || defined(__DOXYGEN__)
559#define SIGILL 4
560#endif
561#define SIGTRAP 5
562#if !defined(SIGABRT) || defined(__DOXYGEN__)
563#define SIGABRT 6
564#endif
565#define SIGBUS 7
566#if !defined(SIGFPE) || defined(__DOXYGEN__)
567#define SIGFPE 8
568#endif
569#define SIGKILL 9
570#define SIGUSR1 10
571#if !defined(SIGSEGV) || defined(__DOXYGEN__)
572#define SIGSEGV 11
573#endif
574#define SIGUSR2 12
575#define SIGPIPE 13
576#define SIGALRM 14
577#if !defined(SIGTERM) || defined(__DOXYGEN__)
578#define SIGTERM 15
579#endif
580/* 16 not used */
581#define SIGCHLD 17
582#define SIGCONT 18
583#define SIGSTOP 19
584#define SIGTSTP 20
585#define SIGTTIN 21
586#define SIGTTOU 22
587#define SIGURG 23
588#define SIGXCPU 24
589#define SIGXFSZ 25
590#define SIGVTALRM 26
591#define SIGPROF 27
592/* 28 not used */
593#define SIGPOLL 29
594/* 30 not used */
595#define SIGSYS 31
597#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
598
599/* SIGILL */
600#define ILL_ILLOPC 1
601#define ILL_ILLOPN 2
602#define ILL_ILLADR 3
603#define ILL_ILLTRP 4
604#define ILL_PRVOPC 5
605#define ILL_PRVREG 6
606#define ILL_COPROC 7
607#define ILL_BADSTK 8
609/* SIGFPE */
610#define FPE_INTDIV 9
611#define FPE_INTOVF 10
612#define FPE_FLTDIV 11
613#define FPE_FLTOVF 12
614#define FPE_FLTUND 13
615#define FPE_FLTRES 15
616#define FPE_FLTINV 16
617#define FPE_FLTSUB 17
619/* SIGSEGV */
620#define SEGV_MAPERR 18
621#define SEGV_ACCERR 19
623/* SIGBUS */
624#define BUS_ADRALN 20
625#define BUS_ADRERR 21
626#define BUS_OBJERR 22
628#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
629/* SIGTRAP */
630#define TRAP_BRKPT 23
631#define TRAP_TRACE 24
632#endif
633
634/* SIGCHLD */
635#define CLD_EXITED 25
636#define CLD_KILLED 26
637#define CLD_DUMPED 27
638#define CLD_TRAPPED 28
639#define CLD_STOPPED 29
640#define CLD_CONTINUED 30
642#if defined(_XOPEN_STREAMS) || defined(__DOXYGEN__)
643/* SIGPOLL */
644#define POLL_IN 31
645#define POLL_OUT 32
646#define POLL_MSG 33
647#define POLL_ERR 34
648#define POLL_PRI 35
649#define POLL_HUP 36
650#endif
651
652/* Any */
653#define SI_USER 37
654#define SI_QUEUE 38
655#define SI_TIMER 39
656#define SI_ASYNCIO 40
657#define SI_MESGQ 41
659#endif
660
661
662#ifdef __cplusplus
663}
664#endif
665
666#endif /* defined(_POSIX_C_SOURCE) || defined(__DOXYGEN__) */
667
668#endif /* ZEPHYR_INCLUDE_POSIX_POSIX_SIGNAL_H_ */
int pid_t
Process ID type.
Definition fcntl.h:192
int sigqueue(pid_t pid, int sig, union sigval value)
Queue a signal and data to a process.
int sigtimedwait(const sigset_t *ZRESTRICT set, siginfo_t *ZRESTRICT info, const struct timespec *ZRESTRICT timeout)
Wait for a queued signal with a timeout.
int sigwaitinfo(const sigset_t *ZRESTRICT set, siginfo_t *ZRESTRICT info)
Wait for a queued signal (no timeout).
int sigignore(int sig)
Set a signal's disposition to SIG_IGN (XSI, obsolescent).
int sigdelset(sigset_t *set, int sig)
Delete a signal from a signal set.
int kill(pid_t pid, int sig)
Send a signal to a process or process group.
int killpg(pid_t pgrp, int sig)
Send a signal to a process group (XSI extension).
int sigemptyset(sigset_t *set)
Initialise a signal set to the empty set.
int siginterrupt(int sig, int flag)
Control whether a signal restarts or interrupts system calls (XSI, obsolescent).
int sigismember(const sigset_t *set, int sig)
Test whether a signal is a member of a signal set.
int sigsuspend(const sigset_t *set)
Wait for a signal, atomically replacing the process signal mask.
int sigprocmask(int how, const sigset_t *ZRESTRICT set, sigset_t *ZRESTRICT oset)
Examine and change the calling process's signal mask.
int sigpending(sigset_t *set)
Retrieve the set of pending signals.
int sigfillset(sigset_t *set)
Initialise a signal set to the full set (all signals).
int sigrelse(int sig)
Remove a signal from the process signal mask (XSI, obsolescent).
int sighold(int sig)
Add a signal to the calling process's signal mask (XSI, obsolescent).
int sigwait(const sigset_t *ZRESTRICT set, int *ZRESTRICT sig)
Wait for a signal from a set.
int sigpause(int sig)
Suspend execution until a signal is delivered (XSI, obsolescent).
void psiginfo(const siginfo_t *info, const char *message)
Print a signal description with additional siginfo_t context.
int sigaddset(sigset_t *set, int sig)
Add a signal to a signal set.
sighandler_t sigset(int sig, sighandler_t disp)
Set the disposition of a signal, optionally blocking it first (XSI, obsolescent).
int sigaltstack(const stack_t *ZRESTRICT ss, stack_t *ZRESTRICT oss)
Set or get the alternate signal stack (XSI extension).
void psignal(int sig, const char *message)
Print a signal description to stderr.
int pthread_sigmask(int how, const sigset_t *ZRESTRICT set, sigset_t *ZRESTRICT oset)
Examine and change blocked signals for the calling thread.
int pthread_kill(pthread_t thread, int sig)
Send a signal to a specific thread.
void(* sighandler_t)(int sig)
Function pointer type for a simple signal handler.
Machine-specific context saved when a signal is delivered.
unsigned long flags
Architecture-specific flags.
Signal action structure used with sigaction().
void(* sa_sigaction)(int sig, siginfo_t *info, void *context)
Extended handler (SA_SIGINFO set).
sigset_t sa_mask
Signals blocked during handler execution.
void(* sa_handler)(int sig)
Simple handler (SA_SIGINFO not set).
int sa_flags
Flags modifying signal behaviour (SA_* constants).
Structure describing how to notify about an asynchronous event.
void(* sigev_notify_function)(union sigval value)
Notification function.
pthread_attr_t * sigev_notify_attributes
Thread attributes for SIGEV_THREAD.
int sigev_signo
Signal number for SIGEV_SIGNAL notifications.
union sigval sigev_value
Value passed to notification function or signal.
int sigev_notify
Notification type: SIGEV_NONE, SIGEV_SIGNAL, SIGEV_THREAD.
Information associated with a received signal.
int si_code
Signal code (reason the signal was generated).
uid_t si_uid
Real UID of the sending process.
int si_signo
Signal number.
pid_t si_pid
Sending process ID.
long si_band
Band event number for SIGPOLL (XSI streams).
int si_status
Exit value or signal (SIGCHLD).
void * si_addr
Address of the faulting instruction (SIGILL, SIGFPE, SIGSEGV, SIGBUS).
int si_errno
errno value associated with this signal, or 0.
Type representing a set of signals (bitmask).
Alternate signal stack descriptor.
void * ss_sp
Stack base address.
int ss_flags
SS_ONSTACK or SS_DISABLE.
size_t ss_size
Stack size in bytes.
Time value with nanosecond resolution.
Definition aio.h:62
long tv_nsec
Nanoseconds [0, 999999999].
Definition aio.h:64
time_t tv_sec
Seconds.
Definition aio.h:63
User-space context saved and restored by getcontext()/setcontext().
stack_t uc_stack
Stack used by this context.
struct ucontext * uc_link
Context to resume when this one returns.
mcontext_t uc_mcontext
Machine-specific saved state.
sigset_t uc_sigmask
Signals blocked in this context.
POSIX time-of-day types and functions (<sys/time.h>)
Value passed to a signal handler or retrieved via siginfo_t.
void * sival_ptr
Pointer value.
int sival_int
Integer value.