Home | History | Annotate | Download | only in nanosleep
      1 /*
      2  * Copyright (c) 2002, Intel Corporation. All rights reserved.
      3  * Created by:  julie.n.fleischer 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  * Test that nanosleep() does not effect the action of a signal.
      9  * - Start nanosleep() in a child process
     10  * - Send a signal to the child process and have the handler exit with
     11  *   success; if the handler is not called, return 0
     12  * - In the parent, if the child exited success, return success.
     13  */
     14 #include <stdio.h>
     15 #include <time.h>
     16 #include <signal.h>
     17 #include <unistd.h>
     18 #include <sys/wait.h>
     19 #include <stdlib.h>
     20 #include "posixtest.h"
     21 
     22 #define CHILDSUCCESS 1
     23 #define CHILDFAIL 0
     24 
     25 void handler(int signo)
     26 {
     27 	printf("Received signal - exit success\n");
     28 	exit(CHILDSUCCESS);
     29 }
     30 
     31 int main(void)
     32 {
     33 	struct timespec tssleepfor, tsstorage;
     34 	int sleepsec = 30;
     35 	int pid;
     36 	struct sigaction act;
     37 
     38 	if ((pid = fork()) == 0) {
     39 		/* child here */
     40 
     41 		act.sa_handler = handler;
     42 		act.sa_flags = 0;
     43 		if (sigemptyset(&act.sa_mask) == -1) {
     44 			perror("Error calling sigemptyset\n");
     45 			return CHILDFAIL;
     46 		}
     47 		if (sigaction(SIGABRT, &act, 0) == -1) {
     48 			perror("Error calling sigaction\n");
     49 			return CHILDFAIL;
     50 		}
     51 		tssleepfor.tv_sec = sleepsec;
     52 		tssleepfor.tv_nsec = 0;
     53 		nanosleep(&tssleepfor, &tsstorage);
     54 		return CHILDFAIL;
     55 	} else {
     56 		/* parent here */
     57 		int i;
     58 
     59 		sleep(1);
     60 
     61 		if (kill(pid, SIGABRT) != 0) {
     62 			printf("Could not raise signal being tested\n");
     63 			return PTS_UNRESOLVED;
     64 		}
     65 
     66 		if (wait(&i) == -1) {
     67 			perror("Error waiting for child to exit\n");
     68 			return PTS_UNRESOLVED;
     69 		}
     70 
     71 		if (WIFEXITED(i) && WEXITSTATUS(i)) {
     72 			printf("Child exited normally\n");
     73 			printf("Test PASSED\n");
     74 			return PTS_PASS;
     75 		} else {
     76 			printf("Child did not exit normally.\n");
     77 			printf("Test FAILED\n");
     78 			return PTS_FAIL;
     79 		}
     80 	}
     81 	return PTS_UNRESOLVED;
     82 }
     83