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 not set, then the 9 signal shall be received at least once 10 11 Steps: 12 - Register for myhandler to be called when SIGTOTEST is called, and make 13 sure SA_SIGINFO is NOT 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 at least once AFTER SIGTOTEST 18 is unblocked. 19 */ 20 21 #define _XOPEN_SOURCE 600 22 #define _XOPEN_REALTIME 1 23 #define SIGTOTEST SIGRTMIN 24 #define NUMCALLS 5 25 26 #include <signal.h> 27 #include <stdio.h> 28 #include <unistd.h> 29 #include <stdlib.h> 30 #include <errno.h> 31 #include "posixtest.h" 32 33 int counter = 0; 34 35 void myhandler(int signo) 36 { 37 counter++; 38 } 39 40 int main(void) 41 { 42 int pid, i; 43 union sigval value; 44 struct sigaction act; 45 46 act.sa_handler = myhandler; 47 act.sa_flags = 0; 48 sigemptyset(&act.sa_mask); 49 sigaction(SIGTOTEST, &act, 0); 50 51 value.sival_int = 0; /* 0 is just an arbitrary value */ 52 pid = getpid(); 53 54 sighold(SIGTOTEST); 55 56 for (i = 0; i < NUMCALLS; i++) { 57 if (sigqueue(pid, SIGTOTEST, value) != 0) { 58 printf 59 ("Test UNRESOLVED: call to sigqueue did not return success\n"); 60 return PTS_UNRESOLVED; 61 } 62 } 63 64 if (0 != counter) { 65 printf 66 ("Test UNRESOLVED: handler called even though %d has not been removed from the signal mask\n", 67 SIGTOTEST); 68 return PTS_UNRESOLVED; 69 } 70 71 sigrelse(SIGTOTEST); 72 73 if (counter < 1) { 74 printf("Test FAILED: %d was not received even once\n", 75 SIGTOTEST); 76 return PTS_FAIL; 77 } 78 printf("Test PASSED: %d was received %d times.\n", SIGTOTEST, counter); 79 return PTS_PASS; 80 } 81