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