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 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