Signal-senden: Speicherzugriffsfehler



  • Hi Leute.
    Ich muss ein Programm schreiben, welches 2 Child Prozesse erzeugt. der eine rechnet was und im anderen kann man signale an den rechnenden schicken.
    da da bei mir garnix hinhaut, hab ich mir mal 2 testprogramme gebastelt. das eine schickt an das andere nen signal..funktioniert nicht.
    also hab ich das beispielprogramm aus der vorlesung abgetippt und....funktioniert NICHT!!!!!

    #include <signal.h>
    #include <stdio.h>
    int a=0;
    int main(){
      printf("%i\n", getpid());
      int signr;
      signr=SIGINT;
      sigset(signr, funktion());
      while(a!=5);
      return 0;
    }
    void funktion(){
      a++;
      printf("STRG-C\n");
      return ;
    }
    

    eigntl sollten wir signal() statt sigset() nehmen, aber er meinte das ist das selbe und mein compiler streikt bei signal()

    Laut Prof sollte sich das programm starten. man drückt STRG-C, printf wird ausgeführt und nach fünfmaligem drücken wirds programm beendet. stattdessen kommt sofort nachm ausführen:
    STRG-C

    drücke ich STRG-C passiert:
    ^CSpeicherzugriffsfehler
    zack tot.

    woran haperts?
    achja ich compilier auf suse falls das jmd interessiert.
    lg



  • InfoStudent schrieb:

    achja ich compilier auf suse falls das jmd interessiert

    Dann wäre die Frage doch etwas für das Linux/Unix-Unterforum



  • Signatur des Handlers falsch (Zeile 12), sigset falsch benutzt (Zeile 8). Auch Suse hat man-pages.

    und mein compiler streikt bei signal()

    Tja, warum wohl? Ohne Fehlermeldung laesst sich da wenig machen. Aber ich habe eine Ahnung.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Probiere es mal mit:

    sigset(signr, funktion)
    

    Also einfach statt den Rückgabewert der Funktion die Funktion selbst als Signalhandler übergeben.

    Bei Deiner Variante sieht der Compiler den Aufruf "funktion()". Da kennt er die Funktion aber gar nicht. Also geht er einfach mal davon aus, dass sie ein int zurück liefert. Dieser Rückgabewert wird dann als Funktionszeiger interpretiert. Später implementiert der Compiler die Funktion als void, also ohne Rückgabewert. Die Rückgabe ist also irgend etwas zufälliges. Kommt ein Signal, dann wird genau diese Adresse angesprungen. Dass da Deine Funktion erreicht wird, ist so wahrscheinlich wie ein 7er im Lotto.


Anmelden zum Antworten