Problem mit setitimer()-Funktion C/C++
-
Hallo,
ich habe ein Problem mit der Standardfunktion setitimer() unter Suse 10.3timer_val.it_value.tv_sec = 0;
timer_val.it_value.tv_usec = 900000;
setitimer(ITIMER_REAL, &timer_val, NULL);durch diese Aufrufe sollte das Systemsignal SIGALRM nach den 900 ms beim Prozess ankommen. Der Signalhandler ist eingerichtet - funktioniert auch - da ein manuelles Senden des SIgnals an den Prozess funktioniert.
Problem:
Unter Suse 10.2 kommt das Signal wie gewünscht beim Prozess an.
Unter Suse 10.3 ist dies nicht mehr so. Es kommt einfach kein Signal an.
( an mehreren Rechnern getestet)Woran könnte dies liegen ?
Gruß
-
Was gibt setitimer denn zurück?
if (setitimer(ITIMER_REAL, &timer_val, NULL)) perror("setitimer");
-
hab ich möglicherweise unter umständen noch gar nicht abgefragt weil s unter 10.2 so gut ging.
werds am montag schreiben.
gruß
-
setitimer gibt "invalid argument" zurück.
aus meiner Sicht sind die Argumente aber korrekt.
Suse 10.2 findet das wohl auch.
Klar ist damit zumindest dass kein Signal ankommen kann.
-
hast du den code auf beiden systemen compiliert oder nur auf beiden ausgeführt?
-
ich hab den code nur auf einem System compiliert.
inzwischen tun sich weitere merkwürdigkeiten auf:ich wollte ausschliesslich die klassenvariable "struct itimerval timer_val" nutzen ( also ohne weitere Varibalen anzulegen) in "time.h" ist auch zu sehen, dass in dieser Struktur weitere Strukturen erzeugt werden. Der Speicher sollte also angelegt werden.
Mache ich dies kommt der obengesagte Fehler. Wenn ich in der Headerdatei nach der Deklaration der struct timer_val noch 6 integer anlege bzw. Speicher der größe von 6 integern (32-bit-System) läuft die setitimer-Funktion durch und alles läuft auch aufm Suse 10.3 System einwandfrei.
Jetzt dachte ich evtl. dass die inneren structs der itimerval-Struktur nicht angelegt und das sind:
2 mal struct timeval:
timeval beinhaltet ein time_t und ein long
wären dann aber nur 4 Integer.Im Endeffekt werde ich die Timer selbst machen mit gettimeofday und differenz berechnen zu einem Timestamp.
Trotzdem werde ich noch weitersuchen - wahrscheinlich liegt der Fehler irgendwo in meinem Programm.
-
sorry, genau kapiert hab ich das jetzt nicht.
toffa schrieb:
ich wollte ausschliesslich die klassenvariable "struct itimerval timer_val" nutzen
was solltest du noch weiteres verwenden wollen?
toffa schrieb:
in "time.h" ist auch zu sehen, dass in dieser Struktur weitere Strukturen erzeugt werden
du meinst die beiden struct timeval?
toffa schrieb:
Mache ich dies kommt der obengesagte Fehler.
wenn du was genau machst?
toffa schrieb:
Wenn ich in der Headerdatei nach der Deklaration der struct timer_val noch 6 integer anlege bzw. Speicher der größe von 6 integern (32-bit-System)...
du änderst was in einer system header datei?
dein letzter beitrag hat mich sehr verwirrt. wenn du eine lösung für dein problem noch willst, erklär das alles bitte etwas detailierter, am besten mit einem vollständigen aber minimalen codebeispiel, bei dem das problem noch auftritt.
-
zu beginn sah meine eigene Headerdatei wie folgt aus:
// CKlasse.h ... #include <sys/time.h> class CKlasse { public: ... private: struct itimerval timer_val; ... }
und in meinem entsprechenden cppFile
// CKlasse.cpp #include "CKlasse.h" ... void methode() { timer_val.it_value.tv_sec = 0; timer_val.it_value.tv_usec = 900000; if (setitimer(ITIMER_REAL, &timer_val, NULL) == -1) perror("setitimer"); } ....
In dieser Konfiguration funktioniert es nicht unter 10.3 er Suse. Es kommt wie beschrieben unter 10.3 er SUse kein Signal an: Der Fehler der setitimer-Funktion ist "invalid Argument".
Wenn ich nun den Code meiner eigenen Headerdatei folgendermassen abändere:
// CKlasse.h #include <sys/time.h> class CKlasse { public: .... private: ... struct itimerval timer_val; int eins, zwei, drei, vier, fuenf, sechs; }
funktioniert seltsamerweise der Timer.
Dies funktioniert nur, wenn ich die sechs Integer nach der struct timer_val deklariere. Die sechs Integer werden nirgends benutzt.
Erkannt habe ich das mit den Integern weil ich vorher zufällig in der Headerdatei folgendes integriert hatte:// CKlasse.h #include <sys/time.h> class CKlasse { public: .... private: ... struct itimerval timer_val; struct timeval time1, time2, time3; }
Die strucs vom Typ timeval waren nur vorhanden, da ich manuelle Timer zum Testen erzeugt hatte.
Ich sehe ein dass mein voriger Text relativ unverständlich und mehrdeutig war.
Ich hoffe das dies etwas besser gelungen ist.
-
ich kann hier leider nur spekulieren. die beiden suse unterschieden sich wahrscheinlich in der kernel version und/oder der version der glibc, sodass sie anscheinend nicht mehr binär kompatibel sind. die andere idee ist, dass du irgendwo in deinem programm einen bug hast, der sich bei dem einen suse auswirkt, dem anderen aber nicht.
du könntest noch probieren, auf beiden suse ein echt kleines programm laufen zu lassen, das grad mal eine main hat und die funktion setitimer ausführt. sollte das kleine programm dann auch auf einem suse funktionieren und auf dem anderen nicht, so ist idee 1 die richtige. sonst die sache mit dem bug in deinem programm irgendwo anders. wenn man durch mehr variablen an einer stelle ein programm zum funktionieren bringt, ist meistens ein bug irgendwo.
-
toffa schrieb:
Dies funktioniert nur, wenn ich die sechs Integer nach der struct timer_val deklariere. Die sechs Integer werden nirgends benutzt.
Es müssen also ganau sechs int sein?!
namenlos schrieb:
die beiden suse unterschieden sich wahrscheinlich in der kernel version und/oder der version der glibc, sodass sie anscheinend nicht mehr binär kompatibel sind.
Wäre also sinnvoll, die jeweiligen Versionen der glibc, des kernels und des gcc zu erfahren. Zudem noch die frage, ob beides 32bit Architekturen sind?
Funktioniert es unter 10.3 wenn du es da übersetzt?
Funktioniert es wenn du dem dritten Parameter einen Zeiger auf noch eine itimerval struct mitgibst?
Passiert es auch wenn du mit Debuginformationen übersetzt? Wenn ja, wie wärs mit debuggen
-
ok leute alles ist klar
danke für die antworten!
ich hätte die manpage von setitimer mal richtig lesen sollen.
in meinem Buch stand der Unterschied zwischen der struktur it_interval und it_value (innerhalb der itimerval-struktur) nicht gut genug drinnen.
also hab ich nur it_value initialisiert und it_interval stand auf kaudawelsch.
unter 10.2 ist wohl dieser kaudawelsch wohl gut genug für die setitimer-funktion (es sind unter 10.2 und 10.3 definitiv zwei unterschiedliche versionon von glibc und kernel)
unter 10.3 gab es aus diesem grund eben den Argumentenfehler.
Jetzt ist wieder alles bestesIst wohl die Fehlerabfrage in der Standardbibliothek besser geworden
Nächstes mal komme ich mit einem anderen Problem
jetzt noch die Antworten auch wenn sie jetzt sinnlos erscheinen:
beides waren 32 bit versionen
ja mussten immer 6 int sein
ich hatte unter 10.3 compiliert und auf 10.2 getestet - nicht umgekehrt.
-
Hmm, leider funktioniert es bei mir noch immer nicht...
ich erhalte noch immer "setitimer: Invalid argument"Vielleicht kann mir jmd. den entscheidenden Tipp geben?
Das System ist: Ubuntu Server 2.6.22-14-serverDank im Voraus!
struct sigaction sigAction; struct itimerval timerVal; memset(&sigAction, 0, sizeof (sigAction)); fSigAction.sa_handler = &timerHandler; sigaction(SIGVTALRM, &sigAction, NULL); timerVal.it_value.tv_sec = 0; timerVal.it_value.tv_usec = msec * 1000; timerVal.it_interval.tv_sec = 0; timerVal.it_interval.tv_usec = 0; if ( setitimer(ITIMER_REAL, &timerVal, NULL) != 0 ) { perror("setitimer"); }
-
ha problem solved!
hab bei tv.usec sekunden mitgegeben... also statt
tv.sec = 3;
tv.usec = 0;
hab ich
tv.sec = 0;
tv.usec = 3000*1000;mitgegeben...
nun gehts
danke