Signale / Core Dump mit sos1_wait testen

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Signale / Core Dump mit sos1_wait testen
Signale zustellen
Zum Testen benoetigt ihr SIGINT bzw. SIGQUIT. Bei letzterem wird ein Coredump erzeugt. Die dafuer ueblichen Tastenkombinationen CTRL+C bzw CTRL+\ (siehe Folien zur 1. Tafeluebung) funktionieren hier nicht, da eure Shell gleich mitgekillt wird. Die Signale koennen aber mit dem kill(1) Kommando direkt an sos1_wait zugestellt werden. Dazu

  1. sos1_wait in der mini_sh starten

  2. PID von sos1_wait ermitteln

ps -u $USER | grep sos1_wait simistil@faui06o[aufgabe3] ps -u $USER | grep sos1_wait 13896 pts/0 00:00:00 sos1_wait
die PID ist in diesem Fall 13896

  1. dem Prozess das entsprechende Signal zustellen
kill -INT 13896
bzw.
kill -QUIT 13896

Coredumps erlauben
Die Coredumpsize ist normalerweise auf 0 beschraenkt (zumindest in meinem Environment).
Dies kann mit dem Shell Kommando ulimit geprueft werden:

simistil@faui06o[aufgabe3] ulimit -c
0

oder fuer die tcsh

faui06o:/tmp> limit coredumpsize coredumpsize 0 kbytes

Die Maximale Coredumpgroesse ist 0, damit sind Coredumps deaktiviert.
Aktiviert werden koennen sie z.B. mit

simistil@faui06o[aufgabe3] ulimit -c 8192

bzw. fuer tcsh

faui06o:/tmp> limit coredumpsize 8192

Jetzt wird beim erhalt einen SIGQUIT ein coredump erzeugt (Datei core im aktuellen Verzeichnis).

P.S.: An der ausgegebenen mini_sh im pub kann ich die core dump Ausgabe im Moment nicht nachvollziehen, aber bei einer Loesung in der Rechneruebung hat es eben funktioniert :wink:

WCOREDUMP Definition prüfen
WCOREDUMP ist im POSIX_SOURCE nicht enthalten, deshalb braucht ihr die zusätzliche Option -D_BSD_SOURCE beim Kompilieren (siehe Aufgabenstellung). Euer Programm soll mit und ohne -D_BSD_SOURCE kompilieren und funktionieren, wenn _BSD_SOURCE nicht gegeben und damit WCOREDUMP nicht verfügbar ist, soll einfach keine Ausgabe von (core dumped) stattfinden.
Diese Überprüfung kann man mit Präprozessoranweisungen durchführen, was folgendes Beispielprogramm verdeutlichen soll:

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>

int main() {

#ifdef WCOREDUMP
        printf("core dump available\n");
#else
        printf("core dump undefined\n");
#endif
        return 0;
}

Der Präprozessor läuft vor dem eigentlichen Compiler und erzeugt temporär das eigentliche Sourcefile, in dem dann alle Header etc textuell eingebunden sind. Oben wird der Part im ifdef nur dann eingebunden wenn die Bedinung erfüllt ist, das heisst im ifdef Teil kann WCOREDUMP verwendet werden da es garantiert definiert ist. Ansonsten wird in das Programm der else Teil eingefügt. Der jeweils nicht zutreffende Teil wird somit für den Compiler gar nicht sichtbar. Mehr Info hierzu (hoffentlich) in eurer Tafelübung!


wertvoller hinweis, hätt ich den nur vor ner halben stunde gesehn :wink:

woran liegt das eigentlich dass mini_sh das nicht abfangen kann (bzw. das SIGINT wohl an die unterste mini_sh direkt geschickt wird? oder an alle?), man aber zb auf der mini_sh bash startet, die widerum keine probleme damit hat? d.h. was passiert dann eigentlich wenn man STRG-C drückt?


die bash fängt das signal ab. wie das geht erfahrt ihr später im semester :wink:


alles klar :wink: (oder so)