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 if SA_SIGINFO is set, then the 9 signal shall be queued to the receiving process and that sigqueue returns 0. 10 11 Steps: 12 - Register for myhandler to be called when SIGTOTEST is called, and make 13 sure SA_SIGINFO is set. 14 - Block signal SIGTOTEST from the process. 15 - Using sigqueue(), send NUMCALLS instances of SIGTOTEST to the current 16 process. 17 - Call sigwaitinfo() NUMCALLS times, and verify that the queued signals are 18 selected in FIFO order. 19 20 */ 21 22 #define _XOPEN_SOURCE 600 23 #define _XOPEN_REALTIME 1 24 #define SIGTOTEST SIGRTMIN 25 #define NUMCALLS 5 26 27 #include <signal.h> 28 #include <stdio.h> 29 #include <unistd.h> 30 #include <stdlib.h> 31 #include <errno.h> 32 #include "posixtest.h" 33 34 int counter = 0; 35 36 void myhandler(int signo, siginfo_t * info, void *context) 37 { 38 counter++; 39 } 40 41 int main(void) 42 { 43 int pid, i; 44 union sigval value; 45 struct sigaction act; 46 sigset_t selectset; 47 siginfo_t info; 48 49 act.sa_flags = SA_SIGINFO; 50 act.sa_sigaction = myhandler; 51 sigemptyset(&act.sa_mask); 52 sigaction(SIGTOTEST, &act, 0); 53 54 pid = getpid(); 55 56 sighold(SIGTOTEST); 57 58 for (i = NUMCALLS; i > 0; i--) { 59 value.sival_int = i; 60 if (sigqueue(pid, SIGTOTEST, value) != 0) { 61 printf 62 ("Test FAILED: call to sigqueue did not return success\n"); 63 return PTS_FAIL; 64 } 65 } 66 67 sigemptyset(&selectset); 68 sigaddset(&selectset, SIGTOTEST); 69 70 for (i = NUMCALLS; i > 0; i--) { 71 if (sigwaitinfo(&selectset, &info) != SIGTOTEST) { 72 perror 73 ("sigwaitinfo() returned signal other than SIGTOTEST\n"); 74 return PTS_UNRESOLVED; 75 } 76 if (info.si_value.sival_int != i) { 77 printf 78 ("Test FAILED: The queued value %d was dequeued before " 79 "the queued value %d even though %d was queued first.\n", 80 info.si_value.sival_int, i, i); 81 return PTS_FAIL; 82 } 83 } 84 85 return PTS_PASS; 86 } 87