xref: /haiku/src/tests/system/kernel/wait_test_2.cpp (revision 17889a8c70dbb3d59c1412f6431968753c767bab)
1 /*
2  * Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <errno.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <sys/wait.h>
11 #include <unistd.h>
12 
13 
14 /*!
15 	wait() should wait only once. If any argument is given, waitpid() should return
16 	an error (and errno to ECHILD), since there is no child with that process group ID.
17 */
18 
19 
20 int
21 child2()
22 {
23 	sleep(2);
24 	return 2;
25 }
26 
27 
28 //! exits before child 2
29 int
30 child1()
31 {
32 	setpgrp();
33 		// put us into a new process group
34 
35 	pid_t child = fork();
36 	if (child == 0)
37 		return child2();
38 
39 	sleep(1);
40 	return 1;
41 }
42 
43 
44 int
45 main(int argc, char** argv)
46 {
47 	bool waitForGroup = argc > 1;
48 
49 	pid_t child = fork();
50 	if (child == 0)
51 		return child1();
52 
53 	pid_t pid;
54 	do {
55 		int childStatus = -1;
56 		if (waitForGroup)
57 			pid = waitpid(0, &childStatus, 0);
58 		else
59 			pid = wait(&childStatus);
60 		printf("wait() returned %ld (%s), child status %d\n",
61 			pid, strerror(errno), childStatus);
62 	} while (pid >= 0);
63 
64 	return 0;
65 }
66 
67