#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
[[noreturn]] void dowork() {
std::cout << "Child doing work..." << std::endl;
// Exit with 0 to indicate success or any other number to indicate failure
std::srand(time(nullptr));
int result = std::rand() & 1;
std::exit(result);
}
int main()
{
int exitCode;
do {
pid_t pid = fork();
if(pid == -1) {
std::cout << "fork() failed" << std::endl;
continue;
}
if(pid == 0) {
// Child - Function call never returns
dowork();
}
// Parent - Wait until child finished / dies
int status;
pid_t res = waitpid(pid, &status, 0);
if(res == -1) {
std::cout << "waitpid() failed" << std::endl;
continue;
}
if(WIFEXITED(status)) {
exitCode = WEXITSTATUS(status);
} else {
// Child could have died by signal or other causes...
exitCode = -1;
}
std::cout << "Child exited with " << exitCode << std::endl;
sleep(1);
} while(exitCode != 0);
return 0;
}