Home | History | Annotate | Download | only in sigwaitinfo
      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 by sigwaitinfo() 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 sure SA_SIGINFO is set.
     15  - Also, make sure that all of these signals are added to the set that
     16    will be passed to sigwaitinfo().
     17  - Block all of these signals from the process.
     18  - Raise all of these signals using sigqueue.
     19  - call sigwaitinfo() and verify that it returns SIGRTMIN
     20  */
     21 
     22 #define _XOPEN_SOURCE 600
     23 #define _XOPEN_REALTIME 1
     24 
     25 #include <signal.h>
     26 #include <stdio.h>
     27 #include <unistd.h>
     28 #include <stdlib.h>
     29 #include <errno.h>
     30 #include "posixtest.h"
     31 
     32 void myhandler(int signo, siginfo_t * info, void *context)
     33 {
     34 	printf("Inside dummy handler\n");
     35 }
     36 
     37 int main(void)
     38 {
     39 	int pid, rtsig;
     40 	union sigval value;
     41 	struct sigaction act;
     42 	sigset_t selectset;
     43 
     44 	act.sa_flags = SA_SIGINFO;
     45 	act.sa_sigaction = myhandler;
     46 	sigemptyset(&act.sa_mask);
     47 	sigemptyset(&selectset);
     48 
     49 	for (rtsig = SIGRTMAX; rtsig >= SIGRTMIN; rtsig--) {
     50 		sigaddset(&act.sa_mask, rtsig);
     51 		sighold(rtsig);
     52 		sigaddset(&selectset, rtsig);
     53 	}
     54 
     55 	pid = getpid();
     56 	value.sival_int = 5;	/* 5 is just an arbitrary value */
     57 
     58 	for (rtsig = SIGRTMAX; rtsig >= SIGRTMIN; rtsig--) {
     59 		sigaction(rtsig, &act, 0);
     60 		if (sigqueue(pid, rtsig, value) != 0) {
     61 			printf
     62 			    ("Test UNRESOLVED: call to sigqueue did not return success\n");
     63 			return PTS_UNRESOLVED;
     64 		}
     65 	}
     66 
     67 	if (sigwaitinfo(&selectset, NULL) != SIGRTMIN) {
     68 		printf
     69 		    ("Test FAILED: sigwaitinfo() did not return the lowest of the multiple pending signals between SIGRTMIN and SIGRTMAX\n");
     70 		return PTS_FAIL;
     71 	}
     72 
     73 	return PTS_PASS;
     74 }
     75