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
Lesezeichen