Anzeige:
Ergebnis 1 bis 5 von 5

Thema: signale, alarm, socket

  1. #1
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123

    signale, alarm, socket

    hi,
    das mini unten soll nach jedem Alarm zum Makro (setjmp(...)) springen ..
    Einmal funktioniert das ganze ja, aber danach halt nicht mehr.


    Code:
    #include <iostream>
    #include <signal.h>
    #include <unistd.h>
    #include <setjmp.h>
    
    static jmp_buf progzust;
    
    
    /*	Funktion zur Behandlung des Timeout-Signals
      */
    void sig_alrm(int snr) {
        longjmp(progzust, 1);
    }
    
    int main()
    {
        int timeout = 0;
        if (signal(SIGALRM, sig_alrm) == SIG_ERR) { 
            std::cerr << "Signalhandler not installed (recv)" << std::endl;
        }
        if (setjmp(progzust) !=0 ) {
            timeout += 1;
        }
        alarm(1);
        std::cout << " weiter "<< std::endl;
        while(timeout < 3){}
        alarm(0);
        return 0;
    }
    das zweite beispiel (hier gefunden) funktioniert auch nach ein paar winzigen modifikationen noch. Leider nicht mit meinem Problem .... s. u.

    Code:
    #include <signal.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <iostream>
    
    static int AlarmReached = 0;
    
    void Signalhandler(int sig)
    {
       AlarmReached += 1;
    
       alarm(1);
    }
    
    int main()
    {
       signal(SIGALRM, Signalhandler);
       alarm(5); // Nach 5 Sekunden auslösen
        std::cout << "und auf " << std::endl;
       while (AlarmReached < 5 ) { 
       sleep(50);
           std::cout << "sleep" << std::endl;
       }
    }
    den Abbruch über ein Timeout wollte ich dazu verwenden mein kleines Problem (siehe unten) zu beheben. leider funktioniert das nicht so wie es sollte ....

    und zweite frage:

    mein problem liegt eigentlich darin, dass mein client beim lesen mit recv von einem bestehenden socket (http-verbindung) gelegentlich probleme hat.
    leider läßt sich das ganze nicht abbrechen. laut debugger steckt er in der funktion recv drin:
    <recv+28>: mov %edx,%ebx
    das ganze scheint blockiert zu sein.
    kann ich das mit fcntl ändern?

    grüsse reinhard

  2. #2
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    ein strace liefert mir das hier:

    Code:
    alarm(10)                               = 0
    recv(8, 0xbfa4ed0b, 512, 0)             = ? ERESTARTSYS (To be restarted)
    --- SIGALRM (Alarm clock) @ 0 (0) ---
    sigreturn()                             = ? (mask now [])
    recv(8,
    der alarm wird abgesetzt, aber dann wars das auch ... er hängt wieder da wo er war .....


    Code:
    static int timeout = 0;
    --------------------------------------
    .......
        if (!timeout) {
            status = ::recv ( m_sock, buf, MAXRECV,0);
        } else {
            timeout =0;
            status = -1;
        }
    hat da jemand noch einen tip?
    gruesse

    ps.anbei hängt ein log von
    strace -e trace=network -o log.txt ./progname
    Geändert von pucki (03-04-2006 um 22:52 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    hi,

    sorry ich hatte wohl mit den falschen begriffen hier im forum gesucht ;-)

    mein problem konnte ich mit select loesen.

    hat noch jemand nen tip, wieso das mit dem signal nicht funktioniert? geht das bei blockierten systemfunktionen nicht?

    gruesse reinhard

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.09.2004
    Beiträge
    20
    Hallo.

    Da du ja scheinbar sowieso in C++ programierst, hier ein Link, wie du die C-Signal-Handler besser in den OO-Kontext bringen kannst: http://www.cs.wustl.edu/~schmidt/signal-patterns.html

    Allerdings legt das Ding in dieser Form eine Tabelle für alle Signale an, aber du kannst es ja ggf. anpassen oder willst soweiso noch SIGINT oder so abfangen.

    Gruß
    L00NIX

  5. #5
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    thanks,

    das werde ich mal durchgehen, wenn noch fragen bleiben melde ich mich ;-)

    gruesse

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •