xref: /llvm-project/lldb/test/API/functionalities/fork/resumes-child/main.cpp (revision af9e1fa178433653eb3d36c42cad016449873cfc)
1 #include <cassert>
2 #include <chrono>
3 #include <cstdlib>
4 #include <sys/wait.h>
5 #include <thread>
6 #include <unistd.h>
7 
main()8 int main() {
9   pid_t fork_result = fork(); // break here
10   assert(fork_result >= 0);
11   if (fork_result == 0) {
12     // child
13     _exit(47);
14   }
15   // parent
16   // Use polling to avoid blocking if the child is not actually resumed.
17   auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(10);
18   std::chrono::milliseconds poll_interval{10};
19   while (std::chrono::steady_clock::now() < deadline) {
20     int status;
21     pid_t waitpid_result = waitpid(fork_result, &status, WNOHANG);
22     if (waitpid_result == fork_result)
23       return 0;
24     assert(waitpid_result == 0);
25     std::this_thread::sleep_for(poll_interval);
26     poll_interval *= 2;
27   }
28   abort();
29 }
30