diff options
Diffstat (limited to 'keepalive.c')
-rw-r--r-- | keepalive.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/keepalive.c b/keepalive.c new file mode 100644 index 0000000..380be52 --- /dev/null +++ b/keepalive.c @@ -0,0 +1,44 @@ +#include <unistd.h> +#include <stdio.h> +#include <time.h> + +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); + } +} |