• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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() causes the current thread to be suspended
9  * until a signal whose action is to terminate the process is received.
10  */
11 #include <stdio.h>
12 #include <time.h>
13 #include <signal.h>
14 #include <unistd.h>
15 #include <sys/wait.h>
16 #include "posixtest.h"
17 
main(void)18 int main(void)
19 {
20 	struct timespec tssleepfor, tsstorage, tsbefore, tsafter;
21 	int sleepsec = 30;
22 	int pid;
23 
24 	if (clock_gettime(CLOCK_REALTIME, &tsbefore) == -1) {
25 		perror("Error in clock_gettime()\n");
26 		return PTS_UNRESOLVED;
27 	}
28 
29 	if ((pid = fork()) == 0) {
30 		/* child here */
31 		tssleepfor.tv_sec = sleepsec;
32 		tssleepfor.tv_nsec = 0;
33 		nanosleep(&tssleepfor, &tsstorage);
34 	} else {
35 		/* parent here */
36 		int i;
37 
38 		sleep(1);
39 
40 		if (kill(pid, SIGABRT) != 0) {
41 			printf("Could not raise signal being tested\n");
42 			return PTS_UNRESOLVED;
43 		}
44 
45 		if (wait(&i) == -1) {
46 			perror("Error waiting for child to exit\n");
47 			return PTS_UNRESOLVED;
48 		}
49 		if (clock_gettime(CLOCK_REALTIME, &tsafter) == -1) {
50 			perror("Error in clock_gettime()\n");
51 			return PTS_UNRESOLVED;
52 		}
53 
54 		/*
55 		 * pass if we slept for less than the (large) sleep time
56 		 * allotted
57 		 */
58 		if ((tsafter.tv_sec - tsbefore.tv_sec) < sleepsec) {
59 			printf("Test PASSED\n");
60 			return PTS_PASS;
61 		} else {
62 			printf("Slept for too long: %d >= %d\n",
63 			       (int)tsafter.tv_sec - (int)tsbefore.tv_sec,
64 			       sleepsec);
65 			printf("Test FAILED\n");
66 			return PTS_FAIL;
67 		}
68 	}
69 	return PTS_UNRESOLVED;
70 }
71