1 /* 2 * Copyright (c) 2002-2003, Intel Corporation. All rights reserved. 3 * Created by: salwan.searty REMOVE-THIS AT intel DOT com 4 * This file is licensed under the GPL license. For the full content 5 * of this license, see the COPYING file at the top level of this 6 * source tree. 7 8 This program tests the assertion that the lowest pending signal will be 9 selected for delivery if there are any multiple pending signals in the 10 range SIGRTMIN to SIGRTMAX. 11 12 Steps: 13 - Register for myhandler to be called when any signal between SIGRTMIN 14 and SIGRTMAX is generated, and make 15 sure SA_SIGINFO is set. 16 - Also, make sure that all of these signals are added to the handler's 17 signal mask. 18 - Initially block all of these signals from the process. 19 - Raise all of these signals using sigqueue. 20 - Unblock all of these queued signals simultaneously using sigprocmask. 21 - Verify that the signals are delivered in order from smallest to 22 biggest. 23 */ 24 25 #define _XOPEN_SOURCE 600 26 #define _XOPEN_REALTIME 1 27 28 #include <signal.h> 29 #include <stdio.h> 30 #include <unistd.h> 31 #include <stdlib.h> 32 #include <errno.h> 33 #include "posixtest.h" 34 35 int last_signal = 0; 36 int test_failed = 0; 37 38 void myhandler(int signo, siginfo_t * info, void *context) 39 { 40 printf("%d, ", signo); 41 if (last_signal >= signo) { 42 test_failed = 1; 43 } 44 } 45 46 int main(void) 47 { 48 int pid, rtsig; 49 union sigval value; 50 struct sigaction act; 51 sigset_t mask; 52 53 act.sa_flags = SA_SIGINFO; 54 act.sa_sigaction = myhandler; 55 sigemptyset(&act.sa_mask); 56 57 sigemptyset(&mask); 58 59 for (rtsig = SIGRTMAX; rtsig >= SIGRTMIN; rtsig--) { 60 sigaddset(&act.sa_mask, rtsig); 61 sighold(rtsig); 62 sigaddset(&mask, rtsig); 63 } 64 65 pid = getpid(); 66 value.sival_int = 5; /* 5 is just an arbitrary value */ 67 68 for (rtsig = SIGRTMAX; rtsig >= SIGRTMIN; rtsig--) { 69 sigaction(rtsig, &act, 0); 70 if (sigqueue(pid, rtsig, value) != 0) { 71 printf 72 ("Test UNRESOLVED: call to sigqueue did not return success\n"); 73 return PTS_UNRESOLVED; 74 } 75 } 76 77 sigprocmask(SIG_UNBLOCK, &mask, NULL); 78 printf("\n"); 79 80 if (test_failed == 1) { 81 printf 82 ("Test FAILED: A pending signal was delivered even though a smaller one is still pending.\n"); 83 return PTS_FAIL; 84 } 85 86 return PTS_PASS; 87 } 88