#include #include #include volatile int release_child_flag = 0; int main(int argc, char const *argv[]) { pid_t child = fork(); if (child == -1) { perror("fork"); return 1; } if (child > 0) { // parent if (argc < 2) { fprintf(stderr, "Need pid filename.\n"); return 2; } // Let the test suite know the child's pid. FILE *pid_file = fopen(argv[1], "w"); if (pid_file == NULL) { perror("fopen"); return 3; } fprintf(pid_file, "%d\n", child); if (fclose(pid_file) == EOF) { perror("fclose"); return 4; } // And wait for the child to finish it's work. int status = 0; pid_t wpid = wait(&status); if (wpid == -1) { perror("wait"); return 5; } if (wpid != child) { fprintf(stderr, "wait() waited for wrong child\n"); return 6; } if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { fprintf(stderr, "child did not exit correctly\n"); return 7; } } else { // child lldb_enable_attach(); while (! release_child_flag) // Wait for debugger to attach sleep(1); printf("Child's previous process group is: %d\n", getpgid(0)); setpgid(0, 0); // Set breakpoint here printf("Child's process group set to: %d\n", getpgid(0)); } return 0; }