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 - Verify that the handler is executed NUMCALLS times AFTER SIGTOTEST 18 is unblocked. 19 - Verify that sigqueue returns 0. 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 47 act.sa_flags = SA_SIGINFO; 48 act.sa_sigaction = myhandler; 49 sigemptyset(&act.sa_mask); 50 sigaction(SIGTOTEST, &act, 0); 51 52 value.sival_int = 0; /* 0 is just an arbitrary value */ 53 pid = getpid(); 54 55 sighold(SIGTOTEST); 56 57 for (i = 0; i < NUMCALLS; i++) { 58 if (sigqueue(pid, SIGTOTEST, value) != 0) { 59 printf 60 ("Test FAILED: call to sigqueue did not return success\n"); 61 return PTS_FAIL; 62 } 63 } 64 65 if (0 != counter) { 66 printf 67 ("Test UNRESOLVED: handler called even though %d has not been removed from the signal mask\n", 68 SIGTOTEST); 69 return PTS_UNRESOLVED; 70 } 71 72 sigrelse(SIGTOTEST); 73 74 if (NUMCALLS != counter) { 75 printf 76 ("Test UNRESOLVED: %d was queued %d time(s) even though sigqueue was called %d time(s) for %d\n", 77 SIGTOTEST, counter, NUMCALLS, SIGTOTEST); 78 return PTS_UNRESOLVED; 79 } 80 return PTS_PASS; 81 } 82