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/kernel/signal.h>
25#include <zephyr/toolchain.h>
26#include <zephyr/sys/util.h>
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32/* SIG_DFL must be defined by the libc signal.h */
33/* SIG_ERR must be defined by the libc signal.h */
34
35#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
37#define SIG_HOLD ((void *)-2)
38#endif
39
40/* SIG_IGN must be defined by the libc signal.h */
41
42#if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
43
44#if !defined(_PTHREAD_T_DECLARED) && !defined(__pthread_t_defined)
45typedef unsigned int pthread_t;
46#define _PTHREAD_T_DECLARED
47#define __pthread_t_defined
48#endif
49
50#endif /* defined(_POSIX_THREADS) || defined(__DOXYGEN__) */
51
52/* size_t must be defined by the libc stddef.h */
53#include <stddef.h>
54#include <stdint.h>
55
56#if !defined(_UID_T_DECLARED) && !defined(__uid_t_defined)
57typedef int uid_t;
58#define _UID_T_DECLARED
59#define __uid_t_defined
60#endif
61
62/* time_t must be defined by the libc time.h */
63#include <time.h>
64
65#if __STDC_VERSION__ >= 201112L
66/* struct timespec must be defined in the libc time.h */
67#else
68#if !defined(_TIMESPEC_DECLARED) && !defined(__timespec_defined)
69struct timespec {
70 time_t tv_sec;
71 long tv_nsec;
72};
73#define _TIMESPEC_DECLARED
74#define __timespec_defined
75#endif
76#endif
77
78/* sig_atomic_t must be defined by the libc signal.h */
79
80/*
81 * Linux/glibc NPTL: reserve 32 (cancel) and 33; RT signals from 34.
82 * The prior value 32 followed Newlib/Picolibc Cygwin targets (compact
83 * sigset_t); Zephyr sizes sigset_t from SIGNAL_SET_SIZE_MIN_POSIX_REALTIME.
84 */
85#ifndef SIGRTMIN
86#define SIGRTMIN (CONFIG_THREAD_CANCEL_SIGNAL_NUMBER + 2)
87#endif
88#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
89BUILD_ASSERT(CONFIG_POSIX_RTSIG_MAX >= 0);
90BUILD_ASSERT((CONFIG_THREAD_CANCEL_SIGNAL_NUMBER + 2 +
91 CONFIG_POSIX_RTSIG_MAX) <= SIGNAL_SET_SIZE);
93#ifndef SIGRTMAX
94#define SIGRTMAX (SIGRTMIN + CONFIG_POSIX_RTSIG_MAX)
95#endif
96#else
97#ifndef SIGRTMAX
98#define SIGRTMAX SIGRTMIN
99#endif
100#endif
101
102#if !defined(_SIGSET_T_DECLARED) && !defined(__sigset_t_defined)
104typedef struct {
105 unsigned long sig[DIV_ROUND_UP(SIGRTMAX, BITS_PER_LONG)];
106} sigset_t;
107#define _SIGSET_T_DECLARED
108#define __sigset_t_defined
109#endif
110
111#if !defined(_PID_T_DECLARED) && !defined(__pid_t_defined)
112typedef long pid_t;
113#define _PID_T_DECLARED
114#define __pid_t_defined
115#endif
116
117#if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
118
119/* must be identical to the definition in <sys/_pthreadtypes.h> */
120#if !defined(_PTHREAD_ATTR_T_DECLARED) && !defined(__pthread_attr_t_defined)
121typedef struct {
122 void *stack;
123 size_t stacksize;
124 size_t guardsize;
125 uint32_t details;
127#define _PTHREAD_ATTR_T_DECLARED
128#define __pthread_attr_t_defined
129#endif
130
131#endif
132
133/* slightly out of order w.r.t. the specification */
134#if !defined(_SIGVAL_DECLARED) && !defined(__sigval_defined)
136union sigval {
138 void *sival_ptr;
139};
140#define _SIGVAL_DECLARED
141#define __sigval_defined
142#endif
143
144/*
145 * POSIX.1-2017 defines struct sigevent and the SIGEV_* constants in the base <signal.h>
146 * (they are not part of the Realtime Signals option), so they are visible here without
147 * _POSIX_REALTIME_SIGNALS.
148 */
149#if !defined(_SIGEVENT_DECLARED) && !defined(__sigevent_defined)
151struct sigevent {
152#if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
154 void (*sigev_notify_function)(union sigval value);
155#endif
161};
162#define _SIGEVENT_DECLARED
163#define __sigevent_defined
164#endif
165
167#define SIGEV_NONE 1
169#define SIGEV_SIGNAL 2
171#define SIGEV_THREAD 3
172#if defined(_GNU_SOURCE) || defined(__ZEPHYR__) || defined(__DOXYGEN__)
174#define SIGEV_THREAD_ID 4
175#endif
176
177/* Signal constants are defined below */
178
179/* SIGRTMIN and SIGRTMAX defined above */
180
181/* slightly out of order w.r.t. the specification */
182#if !defined(_SIGINFO_T_DECLARED) && !defined(__siginfo_t_defined)
184typedef struct {
185 void *si_addr;
186#if defined(_XOPEN_STREAMS) || defined(__DOXYGEN__)
187 long si_band;
188#endif
189 union sigval si_value;
190 pid_t si_pid;
191 uid_t si_uid;
194#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
196#endif
198} siginfo_t;
199#define _SIGINFO_T_DECLARED
200#define __siginfo_t_defined
201#endif
202
203#if !defined(_SIGACTION_DECLARED) && !defined(__sigaction_defined)
205struct sigaction {
206 union {
207 void (*sa_handler)(int sig);
208 void (*sa_sigaction)(int sig, siginfo_t *info, void *context);
209 };
212};
213#define _SIGACTION_DECLARED
214#define __sigaction_defined
215#endif
216
218#define SIG_BLOCK 1
220#define SIG_UNBLOCK 2
222#define SIG_SETMASK 0
223
224#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
226#define SA_NOCLDSTOP 0x00000001
228#define SA_ONSTACK 0x00000002
229#endif
231#define SA_RESETHAND 0x00000004
233#define SA_RESTART 0x00000008
235#define SA_SIGINFO 0x00000010
236#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
238#define SA_NOCLDWAIT 0x00000020
239#endif
241#define SA_NODEFER 0x00000040
242
243#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
244
246#define SS_ONSTACK 0x00000001
248#define SS_DISABLE 0x00000002
250#define MINSIGSTKSZ 4096
252#define SIGSTKSZ 4096
253
254#if !defined(_MCONTEXT_T_DECLARED) && !defined(__mcontext_t_defined)
256typedef struct {
257 /* FIXME: there should be a much better Zephyr-specific structure that can be used here */
258 unsigned long gregs[32];
259 unsigned long flags;
260} mcontext_t;
261#define _MCONTEXT_T_DECLARED
262#define __mcontext_defined
263#endif
264
265/* slightly out of order w.r.t. the specification */
266#if !defined(_STACK_T_DECLARED) && !defined(__stack_t_defined)
268typedef struct {
269 void *ss_sp;
270 size_t ss_size;
272} stack_t;
273#define _STACK_T_DECLARED
274#define __stack_t_defined
275#endif
276
277#if !defined(_UCONTEXT_T_DECLARED) && !defined(__ucontext_t_defined)
285#define _UCONTEXT_T_DECLARED
286#define __ucontext_defined
287#endif
288
289#endif /* defined(_XOPEN_SOURCE) || defined(__DOXYGEN__) */
290
291/* Siginfo codes are defined below */
292
293#if !defined(_SIGHANDLER_T_DECLARED) && !defined(__sighandler_t_defined)
295typedef void (*sighandler_t)(int sig);
296#define _SIGHANDLER_T_DECLARED
297#define __sighandler_t_defined
298#endif
299
308int kill(pid_t pid, int sig);
309
310#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
319int killpg(pid_t pgrp, int sig);
320#endif
321
329void psiginfo(const siginfo_t *info, const char *message);
330
338void psignal(int sig, const char *message);
339
340#if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
349int pthread_kill(pthread_t thread, int sig);
350
360int pthread_sigmask(int how, const sigset_t *ZRESTRICT set, sigset_t *ZRESTRICT oset);
361#endif
362
363TOOLCHAIN_DISABLE_WARNING(TOOLCHAIN_WARNING_SHADOW);
373int sigaction(int sig, const struct sigaction *ZRESTRICT act, struct sigaction *ZRESTRICT oact);
374TOOLCHAIN_ENABLE_WARNING(TOOLCHAIN_WARNING_SHADOW);
375
384int sigaddset(sigset_t *set, int sig);
385
386#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
395int sigaltstack(const stack_t *ZRESTRICT ss, stack_t *ZRESTRICT oss);
396#endif
397
406int sigdelset(sigset_t *set, int sig);
407
416
425
426#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
434int sighold(int sig);
435
443int sigignore(int sig);
444
453int siginterrupt(int sig, int flag);
454#endif
455
464int sigismember(const sigset_t *set, int sig);
465
466#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
474int sigpause(int sig);
475#endif
476
485
495int sigprocmask(int how, const sigset_t *ZRESTRICT set, sigset_t *ZRESTRICT oset);
496
497#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
507int sigqueue(pid_t pid, int sig, union sigval value);
508#endif
509
510#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
518int sigrelse(int sig);
519
529#endif
530
538int sigsuspend(const sigset_t *set);
539
540#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
550int sigtimedwait(const sigset_t *ZRESTRICT set, siginfo_t *ZRESTRICT info,
551 const struct timespec *ZRESTRICT timeout);
552#endif
553
562int sigwait(const sigset_t *ZRESTRICT set, int *ZRESTRICT sig);
563
564#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
573int sigwaitinfo(const sigset_t *ZRESTRICT set, siginfo_t *ZRESTRICT info);
574#endif
575
576/* Note: only ANSI / ISO C signals are guarded below */
577
578#define SIGHUP 1
579#if !defined(SIGINT) || defined(__DOXYGEN__)
580#define SIGINT 2
581#endif
582#define SIGQUIT 3
583#if !defined(SIGILL) || defined(__DOXYGEN__)
584#define SIGILL 4
585#endif
586#define SIGTRAP 5
587#if !defined(SIGABRT) || defined(__DOXYGEN__)
588#define SIGABRT 6
589#endif
590#define SIGBUS 7
591#if !defined(SIGFPE) || defined(__DOXYGEN__)
592#define SIGFPE 8
593#endif
594#define SIGKILL 9
595#define SIGUSR1 10
596#if !defined(SIGSEGV) || defined(__DOXYGEN__)
597#define SIGSEGV 11
598#endif
599#define SIGUSR2 12
600#define SIGPIPE 13
601#define SIGALRM 14
602#if !defined(SIGTERM) || defined(__DOXYGEN__)
603#define SIGTERM 15
604#endif
605/* 16 not used */
606#define SIGCHLD 17
607#define SIGCONT 18
608#define SIGSTOP 19
609#define SIGTSTP 20
610#define SIGTTIN 21
611#define SIGTTOU 22
612#define SIGURG 23
613#define SIGXCPU 24
614#define SIGXFSZ 25
615#define SIGVTALRM 26
616#define SIGPROF 27
617/* 28 not used */
618#define SIGPOLL 29
619/* 30 not used */
620#define SIGSYS 31
622#if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
623
624/* SIGILL */
625#define ILL_ILLOPC 1
626#define ILL_ILLOPN 2
627#define ILL_ILLADR 3
628#define ILL_ILLTRP 4
629#define ILL_PRVOPC 5
630#define ILL_PRVREG 6
631#define ILL_COPROC 7
632#define ILL_BADSTK 8
634/* SIGFPE */
635#define FPE_INTDIV 9
636#define FPE_INTOVF 10
637#define FPE_FLTDIV 11
638#define FPE_FLTOVF 12
639#define FPE_FLTUND 13
640#define FPE_FLTRES 15
641#define FPE_FLTINV 16
642#define FPE_FLTSUB 17
644/* SIGSEGV */
645#define SEGV_MAPERR 18
646#define SEGV_ACCERR 19
648/* SIGBUS */
649#define BUS_ADRALN 20
650#define BUS_ADRERR 21
651#define BUS_OBJERR 22
653#if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
654/* SIGTRAP */
655#define TRAP_BRKPT 23
656#define TRAP_TRACE 24
657#endif
658
659/* SIGCHLD si_code values */
660#define CLD_EXITED K_SI_CLD_EXITED
661#define CLD_KILLED K_SI_CLD_KILLED
662#define CLD_DUMPED K_SI_CLD_DUMPED
663#define CLD_TRAPPED K_SI_CLD_TRAPPED
664#define CLD_STOPPED K_SI_CLD_STOPPED
665#define CLD_CONTINUED K_SI_CLD_CONTINUED
667#if defined(_XOPEN_STREAMS) || defined(__DOXYGEN__)
668/* SIGPOLL */
669#define POLL_IN 31
670#define POLL_OUT 32
671#define POLL_MSG 33
672#define POLL_ERR 34
673#define POLL_PRI 35
674#define POLL_HUP 36
675#endif
676
677/* Any */
678#define SI_USER 37
679#define SI_QUEUE 38
680#define SI_TIMER 39
681#define SI_ASYNCIO 40
682#define SI_MESGQ 41
684#endif
685
686
687#ifdef __cplusplus
688}
689#endif
690
691#endif /* defined(_POSIX_C_SOURCE) || defined(__DOXYGEN__) */
692
693#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.
#define SIGRTMAX
Largest real-time signal number.
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).
void psiginfo(const siginfo_t *info, const char *message)
Print a signal description with additional siginfo_t context.
void psignal(int sig, const char *message)
Print a signal description to stderr.
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 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).
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 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.
int killpg(pid_t pgrp, int sig)
Send a signal to a process group (XSI extension).
int sigaltstack(const stack_t *ZRESTRICT ss, stack_t *ZRESTRICT oss)
Set or get the alternate signal stack (XSI extension).
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.
pid_t sigev_notify_thread_id
Thread ID associated with SIGEV_THREAD_ID (Linux-compatible extension)
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.
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:65
long tv_nsec
Nanoseconds [0, 999999999].
Definition aio.h:67
time_t tv_sec
Seconds.
Definition aio.h:66
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.