https://github.com/rontap/elteik-web/raw/main/teaching/opsys/materials/gy2/gy02.zip
Kezdőlap | Visszalibopsys.h | Tovább
Signal
= Jel egy processből a másikba.
Fontosabb signalok: SIGKILL, SIGSEGV, SIGIO, SIGTERM, SIGINT
. Ezek igazából számok, Signalok 1..32 között.
PID = Process ID, a proessz egyedi azonosítója Például a szülő program megölése:
pid_t pid = getppid();
kill(pid,SIGTERM);
Egy nem ‘elkapott’ signal leállítja a processt. Ahhoz, hogy egy process lekezelje a signalt, a következőt kell beállítani:
void handler(int signumber) {
printf("[handler] %i\n", signumber);
}
struct sigaction sigact;
sigact.sa_handler = handler;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction(SIGTERM, &sigact, NULL);
Itt a SIGTERM
signal nem leálltja az alkalmazást, hanem meghívja a handlert. Miután a handler lefutott, folyik a
program futása.
Vannak signalok, amiket nem lehet ‘elkapni’, ilyen pl a SIGKILL
.
A fogadó oldalon lehet ‘várni’ egy signalra. A pause()
egy általános várakozás,
minden signal felébreszti.
A sigsuspend(&sigset)
kap egy signal halmazt.
Azok az elemek, amik nincsenek benne, azokra felébred. A többinél vár tovább.
Példa sigsuspendre, ami csak a SIGTERM
-re ébred fel:
sigset_t sigset;
sigfillset(&sigset);
sigdelset(&sigset, SIGTERM);
sigsuspend(&sigset);
gcc -Wall -Werror=vla -pthread -lrt -std=c11 -pedantic -o a.out ./signal.c && ./a.out
OS/X-en pedig:
clang -Wall -Werror=vla -pthread -std=c11 -pedantic -o a.out ./signal.c && ./a.out
sigprocmask.c
raise
, setitimer.c
Kill.c
Plusz feladat:
A kill sikerességétől függetlenül
írjuk ki egy kill.log
file-ba az alábbi formájú sort:
IDŐ USER SIGNAL PID ERRNO
Ahol: