However, in general, programs may assume that these flags are supported,
since they have all been supported since Linux 2.6,
which was released in the year 2003.
-.PP
-The following example program exits with status 0 if
-.B SA_EXPOSE_TAGBITS
-is determined to be supported, and 1 otherwise.
-.PP
-.EX
-#include <signal.h>
-#include <stdio.h>
-#include <unistd.h>
-
-void handler(int signo, siginfo_t *info, void *context) {
- struct sigaction oldact;
- if (sigaction(SIGSEGV, 0, &oldact) == 0 &&
- !(oldact.sa_flags & SA_UNSUPPORTED) &&
- (oldact.sa_flags & SA_EXPOSE_TAGBITS)) {
- _exit(0);
- } else {
- _exit(1);
- }
-}
-
-int main(void) {
- struct sigaction act = {0};
- act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS;
- act.sa_sigaction = handler;
- if (sigaction(SIGSEGV, &act, 0) != 0) {
- perror("sigaction");
- return 1;
- }
-
- raise(SIGSEGV);
-}
-.EE
.SH RETURN VALUE
.BR sigaction ()
returns 0 on success; on error, \-1 is returned, and
.SH EXAMPLES
See
.BR mprotect (2).
+.PP
+The following example program exits with status
+.B EXIT_SUCCESS
+if
+.B SA_EXPOSE_TAGBITS
+is determined to be supported, and
+.B EXIT_FAILURE
+otherwise.
+.PP
+.EX
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+void
+handler(int signo, siginfo_t *info, void *context)
+{
+ struct sigaction oldact;
+
+ if (sigaction(SIGSEGV, NULL, &oldact) != 0 ||
+ (oldact.sa_flags & SA_UNSUPPORTED) ||
+ !(oldact.sa_flags & SA_EXPOSE_TAGBITS)) {
+ _exit(EXIT_FAILURE);
+ }
+ _exit(EXIT_SUCCESS);
+}
+
+int
+main(void)
+{
+ struct sigaction act = {0};
+
+ act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS;
+ act.sa_sigaction = &handler;
+ if (sigaction(SIGSEGV, &act, NULL) != 0) {
+ perror("sigaction");
+ exit(EXIT_FAILURE);
+ }
+
+ raise(SIGSEGV);
+}
+.EE
.SH SEE ALSO
.BR kill (1),
.BR kill (2),