1 /* 2 * Copyright (c) 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 disp is SIG_HOLD, then the 9 signal shall be added to the process's signal mask. 10 11 Steps: 12 1. Register SIGCHLD with myhandler 13 2. Add SIGCHLD to the process's signal mask using sigset with disp 14 equal to SIG_HOLD 15 3. raise SIGCHLD 16 4. Verify that SIGCHLD is pending. 17 */ 18 19 #define _XOPEN_SOURCE 600 20 21 #include <signal.h> 22 #include <stdio.h> 23 #include <stdlib.h> 24 #include <errno.h> 25 #include <string.h> 26 #include "posixtest.h" 27 28 #define ERR_MSG(f, rc) printf("Failed: func: %s rc: %u errno: %s\n", \ 29 f, rc, strerror(errno)) 30 31 void myhandler(int signo) 32 { 33 printf("SIGCHLD called. Inside handler\n"); 34 } 35 36 int main(void) 37 { 38 sigset_t pendingset; 39 struct sigaction act; 40 act.sa_handler = myhandler; 41 act.sa_flags = 0; 42 sigemptyset(&act.sa_mask); 43 int rc; 44 45 rc = sigaction(SIGCHLD, &act, 0); 46 if (rc) { 47 ERR_MSG("sigaction()", rc); 48 return PTS_UNRESOLVED; 49 } 50 51 if (sigset(SIGCHLD, SIG_HOLD) == SIG_ERR) { 52 perror("Unexpected error while using sigset()"); 53 return PTS_UNRESOLVED; 54 } 55 56 raise(SIGCHLD); 57 58 rc = sigpending(&pendingset); 59 if (rc) { 60 ERR_MSG("sigpending()", rc); 61 return PTS_UNRESOLVED; 62 } 63 64 if (sigismember(&pendingset, SIGCHLD) != 1) { 65 printf("Test FAILED: Signal SIGCHLD wasn't hold.\n"); 66 return PTS_FAIL; 67 } 68 69 printf("Test PASSED\n"); 70 return PTS_PASS; 71 } 72