Home | History | Annotate | Download | only in sigqueue
      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