1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sys/wait.h>
4
5 volatile int release_child_flag = 0;
6
main(int argc,char const * argv[])7 int main(int argc, char const *argv[])
8 {
9 pid_t child = fork();
10 if (child == -1)
11 {
12 perror("fork");
13 return 1;
14 }
15
16 if (child > 0)
17 { // parent
18 if (argc < 2)
19 {
20 fprintf(stderr, "Need pid filename.\n");
21 return 2;
22 }
23
24 // Let the test suite know the child's pid.
25 FILE *pid_file = fopen(argv[1], "w");
26 if (pid_file == NULL)
27 {
28 perror("fopen");
29 return 3;
30 }
31
32 fprintf(pid_file, "%d\n", child);
33 if (fclose(pid_file) == EOF)
34 {
35 perror("fclose");
36 return 4;
37 }
38
39 // And wait for the child to finish it's work.
40 int status = 0;
41 pid_t wpid = wait(&status);
42 if (wpid == -1)
43 {
44 perror("wait");
45 return 5;
46 }
47 if (wpid != child)
48 {
49 fprintf(stderr, "wait() waited for wrong child\n");
50 return 6;
51 }
52 if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
53 {
54 fprintf(stderr, "child did not exit correctly\n");
55 return 7;
56 }
57 }
58 else
59 { // child
60 lldb_enable_attach();
61
62 while (! release_child_flag) // Wait for debugger to attach
63 sleep(1);
64
65 printf("Child's previous process group is: %d\n", getpgid(0));
66 setpgid(0, 0); // Set breakpoint here
67 printf("Child's process group set to: %d\n", getpgid(0));
68 }
69
70 return 0;
71 }
72