Zadania
-
timeout.c
: Stwórz program, który jako argumenty programu przyjmuje maksymalny czas wykonywania podprogramu w sekundach) oraz program (i jego parametry), który ma uruchomić. Następnie tworzy podproces, wywołuje podprogram. Po upływie maksymalnego czasu, jeśli podprogram nie został nadal zamknięty, próbuje go zamknąć najpierw przy pomocySIGTERM
, a jeśli program po 5 sekundach nie zostanie zamknięty zamyka przy pomocySIGKILL
.
$ ./timeout 10 sleep 12 <- zamyka proces `sleep 11` przy pomocy SIGTERM
$ ./timeout 10 sleep 5 <- kończy się w przypadku zakończenia sleep
$ ./timeout 10 ignores_sigterm_and_hangs <- kończy proces poprzez SIGKILL gdyż nie obsłużył SIGTERM
Man
-
man
-
apropos
Sygnały
-
typedef typeof(void (int)) *sighandler_t;
- kształt jaki powinna przyjąć funkcja obsługująca sygnał, np.void handle_signal(int signum);
-
sighandler_t signal(int signum, sighandler_t handler);
- funkcja rejestrująca sygnał -
int sigaction(int signum, const struct sigaction *_Nullable restrict act, struct sigaction *_Nullable restrict oldact);
-
int kill(pid_t pid, int sig);
- wysyła sygnał do procesu -
unsigned int alarm(unsigned int seconds);
- zaseconds
sekund wysyłaSIGALRM