Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : signale, alarm, socket



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

pucki
03-04-2006, 22:34
ein strace liefert mir das hier:



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 .....




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

pucki
07-04-2006, 09:14
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

L00NIX
10-04-2006, 10:18
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

pucki
10-04-2006, 18:31
thanks,

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

gruesse