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