#include #include #include #include #include #define MAX_CNT 10 #define MIN_PERIOD 3600 int main(int argc, char *argv[]) { int cnt, dif; time_t tim1, tim2; pid_t pid; int status; if (argc<2) return 0; cnt = MAX_CNT; while (cnt > 0) { time(&tim1); pid=vfork(); if (pid == 0) { execvp(argv[1], argv+1); printf("%s\n", argv[1]); perror("execvp"); exit(1); } waitpid(pid, &status, 0); if (status==512) { /* kill */ return 0; } if (status==256) { /* restart */ cnt = MAX_CNT; } time(&tim2); dif = (int) difftime(tim2, tim1); cnt += dif / MIN_PERIOD; if (cnt > MAX_CNT) cnt = MAX_CNT; cnt--; if (dif < MIN_PERIOD) { printf("Status=%d. Died after %d sec", status, dif); } else { printf("Status=%d. Died after %f hours", status, dif/3600.); } if (cnt > 0) { printf(" - %d tries left - retry ...\n", cnt); } } printf(" - too many restarts\n"); return -1; }