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