Zadania

  1. 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 pomocy SIGTERM, a jeśli program po 5 sekundach nie zostanie zamknięty zamyka przy pomocy SIGKILL.

$ ./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); - za seconds sekund wysyła SIGALRM

Typy atomowe