| #include <cassert> | |
| #include <chrono> | |
| #include <cstdlib> | |
| #include <sys/wait.h> | |
| #include <thread> | |
| #include <unistd.h> | |
| int main() { | |
| pid_t fork_result = fork(); // break here | |
| assert(fork_result >= 0); | |
| if (fork_result == 0) { | |
| // child | |
| _exit(47); | |
| } | |
| // parent | |
| // Use polling to avoid blocking if the child is not actually resumed. | |
| auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(10); | |
| std::chrono::milliseconds poll_interval{10}; | |
| while (std::chrono::steady_clock::now() < deadline) { | |
| int status; | |
| pid_t waitpid_result = waitpid(fork_result, &status, WNOHANG); | |
| if (waitpid_result == fork_result) | |
| return 0; | |
| assert(waitpid_result == 0); | |
| std::this_thread::sleep_for(poll_interval); | |
| poll_interval *= 2; | |
| } | |
| abort(); | |
| } |