pucki
03-04-2006, 22:20
hi,
das mini unten soll nach jedem Alarm zum Makro (setjmp(...)) springen ..
Einmal funktioniert das ganze ja, aber danach halt nicht mehr.
#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.
#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
das mini unten soll nach jedem Alarm zum Makro (setjmp(...)) springen ..
Einmal funktioniert das ganze ja, aber danach halt nicht mehr.
#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.
#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