-
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
-
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
-
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
-
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
-
thanks,
das werde ich mal durchgehen, wenn noch fragen bleiben melde ich mich ;-)
gruesse