Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Signale senden und empfangen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.10.2006, 21:26 Uhr
Bibbel



Hi Leute,

ich habe folgendes Problem. Ich will/muss Klassen für das Senden und Empfangen von Standard- /RT- Siganlen in C++ schreiben.
Das mit den Senden krieg ich ja noch hin, aber das empfangen ist so ne Sache. Die Klasse fürs empfangen soll Methoden für das ignorieren und blockieren bereitstellen (Auch das geht noch). In den abgeleiteten Klassen sollen Methoden zur Signalbearbeitung bereitgestellt werden. Jetzt wird es schon komplizierter.

Mein Problem ist jetzt genau:
wie kann ich beim empfangen feststellen, welches Signal angekommen ist, also verschickt/ausgelöst wurde?

Hat einer von euch ne Idee?

Danke schonmal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.10.2006, 22:04 Uhr
Pler
Einer von Vielen
(Operator)


Wie gehst du denn vor?
Ich kenne es so, dass man für Signale die man abfangen möchte ne Funktion schreibt und diese dann signal übergibt:

C++:
signal(SIGUSR1, sig_usr_handler);

Wenn sig_usr_handler aufgerufen wurde, wurde eben dieses Signal gesendet.

Ansonsten, wenn du verschiede Signale mit einer Funktion abfangen willst, kann du danach ja einfach mit if und else Prüfen welches es war:

C++:
...
signal(SIGUSR1, sig_usr_handler);
signal(SIGUSR2, sig_usr_handler);
...
void sig_usr_handler(int sign)
{
  if( signr == SIGUSR1)
     ...
  else if ( signr == SIGUSR2 )
    ...
  else
    ...
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.10.2006, 23:24 Uhr
Bibbel



Hi Pler,

erstmal danke für die Antwort! So wie Du das beschriebn hast, hab ich das auch verstanden und hätte es auch so gemacht, aber das Problem ist folgendes:

1. Ich hab gelesen, dass der Signal()-Befehl eigentlich veraltet ist (und auch einige "Fußangeln" hat) und durch das Konstrukt "sigaction" erstetzt werden soll. Das würde dann in etwa so aussehen:

C++:
    sigset_t mask; //das ist die Signalmaske; das ist eine Liste mit Signalen
    struct sigaction act;
    /* jetzt wird der Signal_handler zugeweisen, alternativ könnte man act.sa_handler  
            noch auf SIG_IGN (also ignorieren), oder SIG_DFL (Standardreaktion) setzen
        */

    act.sa_handler = signal_handler;
    sigemptyset(&act.sa_mask);    /* clear signal mask */
    act.sa_flags = 0;
        // Signalhandler wird registriert
    if (sigaction(SIGUSER1, &act, NULL)) {
        perror("sigaction");
        exit(-1);
    }



der Handler würde aussehen, wie bei Dir.

2. Also ich hatte mit meinem Prof über die Aufgabe geredet und er hatte gemeint, ich solle in der Oberklasse ne Wrapper-Methode basteln und in der abgeleiteten den eigentlichen Signalbehandler (Das wäre ja dann das, was Du geschrieben hattest, laut meiner Auffasung) bauen. Nur die Wrapper-Methode macht mir jetzt zu schaffen. In der soll ich die ganze Initialisierung machen; also Masken initialisieren und konfigurieren (wenn ich ihn da richtig verstanden habe). Nach der ganzen Initialisierungskiste würde ich dann den eigentlichen Signal_Handler dem sigaction zuweisen ((act.sa_handler = signal_handler also die Signal_Handler Methode ist auch in der Oberklasse vorhanden, ist aber als virtuelle Methode deklariert und es wird noch nix gemacht -> soll in der abgeleiteten Klasse passieren).
So, jetzt hab ich aber das Problem, dass ich bei der Registrierung des Signal_Handlers (sigaction(SIGUSER1, &act, NULL)) ja eine Signal-nummer angeben muss. Wo kriege ich die her? Ich meine die Wrapper-Methode muss ich ja auch irgendwann aufrufen, oder als Signal_Handler registrieren.
Mein Prof. hat auch noch irgendwas gemeint, von nem statischem Feld (mit den Signalnummern), was ich anlegen solle, damit ich der Unterklasse irgendwie mitteilen kann, welches signal angekommen ist (Ich hab das nicht ganz verstanden, da muss ich ihn am besten nochmal fragen, nur Abgabe ist am Freitag und der brauch immer so ewig mit dem antworten)

Hast Du verstanden, wovon ich rede, bzw. wovon mein Prof geredet hat?
Ist bestimmt etwas verwirrend geschrieben und Denkfehler hab ich bestimmt auch drin, es wäre aber schön, wenn Du mir da weiterhelfen könntest!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.10.2006, 12:57 Uhr
Pablo
Supertux
(Operator)



Zitat von Bibbel:
Hi Pler,

erstmal danke für die Antwort! So wie Du das beschriebn hast, hab ich das auch verstanden und hätte es auch so gemacht, aber das Problem ist folgendes:

1. Ich hab gelesen, dass der Signal()-Befehl eigentlich veraltet ist (und auch einige "Fußangeln" hat) und durch das Konstrukt "sigaction" erstetzt werden soll.


wo hast du das gelesen?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.10.2006, 13:29 Uhr
~Bibbel
Gast


www.pronix.de/pronix-178.html
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.10.2006, 22:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
also sigaction ist schon das "richtige".

ansonsten bekommt dein signal-handler mit dem "int signal"-Parameter das Signal mitgeteilt, d.h da musst du nix weitergeben. Dem "Wrapperkonstruktor" bzw der Funktion wo du halt sigaction aufrufst solltest du halt evtl einen Parameter geben mit dem du von außen das gewünschte Signal mitteilst.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.10.2006, 07:10 Uhr
~Bibbel
Gast


OK,

danke, ich glaub ich habs hinbekommen! Danke für eure Hilfe!
Schönen Tag noch!

Bibbel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: