#include #include #include const useconds_t minSleepTime = 1, maxSleepTime = 1000000; int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "supply a program name\n"); return -1; } useconds_t sleepTime = minSleepTime; time_t td = time(NULL); while (1) { pid_t pid = fork(); switch (pid) { case 0: // child execvp(argv[1], &(argv[1])); return -1; // exec failed, stop case -1: // fork failed, assume temporary failure break; default: // parent wait(NULL); } fprintf(stderr, "child exit, restarting\n"); // apply current and calc new delay td = time(NULL) - td; if (td > 2) { sleepTime = minSleepTime; } usleep(sleepTime); if (td <= 2) { sleepTime *= 2; if (sleepTime > maxSleepTime) sleepTime = maxSleepTime; } td = time(NULL); } }