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);- zasecondssekund wysyłaSIGALRM