Datei verfolgen, die ab und an gelöscht wird
-
Ich nutze ein kleines C-Programm zur Verfolgung meiner Logfiles. Leider schneidet logrotate die Logs nicht einfach ab, sondern bennent sie um, wa einem löschen gleichkommt. Daher reicht ein einfaches
if( 0 == fseek(reader, - seek, SEEK_END) ) { fseek(reader, seek, SEEK_SET); }
nicht aus. Zur Zeit benutze ich so etwas hier:
while(1) { if(NULL == (reader = freopen(MY_LOG, "r", reader))) { sleep(2); seek = 0; while(NULL == (reader = fopen(MY_LOG, "r"))) { syslog(LOG_AUTH | LOG_ERR, "Logratate? Retrying...\n", MY_LOG); sleep(2); } } /* ... aus reader lesen ... */ }
Das sieht nicht nur hässlich aus, sondern ich bin auch ziemlich sicher, dass das freopen() nicht so effektiv ist, wie ich es gerne hätte.
Fragen:
- Kann ich in C ein try/catch nachbilden? Schließlich kann ja logrotate zwischen dem Test und dem Leseversuch die Datei verschieben.
- Gibt es einen Weg herauszufinden, ob ein FILE* noch auf eine existierende Datei zeigt (ohne weitere Hilfsmittel)? Das würde mir das freopen() ersparen.
-
e.lienen schrieb:
- Kann ich in C ein try/catch nachbilden? Schließlich kann ja logrotate zwischen dem Test und dem Leseversuch die Datei verschieben.
ja, aber nur mit Markos.
e.lienen schrieb:
- Gibt es einen Weg herauszufinden, ob ein FILE* noch auf eine existierende Datei zeigt (ohne weitere Hilfsmittel)? Das würde mir das freopen() ersparen.
ich kenne keine Möglichkeit, ich glaub, da gibt es keine.
-
e.lienen schrieb:
[*]Kann ich in C ein try/catch nachbilden? Schließlich kann ja logrotate zwischen dem Test und dem Leseversuch die Datei verschieben.
In C gibt es __try und __except (und __finally).
-
_matze schrieb:
e.lienen schrieb:
[*]Kann ich in C ein try/catch nachbilden? Schließlich kann ja logrotate zwischen dem Test und dem Leseversuch die Datei verschieben.
In C gibt es __try und __except (und __finally).
nein, gibt es nicht. Das sind Microsoft Erweiterungen. siehe msdn
-
supertux schrieb:
_matze schrieb:
e.lienen schrieb:
[*]Kann ich in C ein try/catch nachbilden? Schließlich kann ja logrotate zwischen dem Test und dem Leseversuch die Datei verschieben.
In C gibt es __try und __except (und __finally).
nein, gibt es nicht. Das sind Microsoft Erweiterungen. siehe msdn
Oh, wusste ich nicht. Man lebt irgendwie so in dieser VS-Welt...
-
Danke für die Antworten. Läuft also doch auf C++ hinaus das ganze.
-
Ich habe mich auch gerade hingesetzt und erstmal schön ein progi geschrieben, was __try und so können osllte,
naja es ist wirklcih nicht in C vorhanden.
Das Beispiel bei MSDN ist eine cpp Datei... Falls jemand sowas mal finden sollte... PostItHere
-
lippoliv schrieb:
Ich habe mich auch gerade hingesetzt und erstmal schön ein progi geschrieben, was __try und so können osllte,
naja es ist wirklcih nicht in C vorhanden.
Das Beispiel bei MSDN ist eine cpp Datei... Falls jemand sowas mal finden sollte... PostItHere
Ich verstehe leider nicht ganz, was du meinst. __try/__except kannst du jedenfalls mit dem VS-C-Compiler in einer c-Datei verwenden (machen wir in unserer Firma), auch wenn im MSDN-Beispiel eine cpp-Datei gezeigt wird.
Nur aus Interesse: Wie würden denn Makros aussehen, die try/catch in C nachbilden?
-
_matze schrieb:
Nur aus Interesse: Wie würden denn Makros aussehen, die try/catch in C nachbilden?
ich hab mir die ganze Zeit Gedanken darüber gemacht. Ich weiß, dass ich in einem anderem Forum das schon gesehen habe. Ich kann leider den Thread nicht finden.
-
Die volle Funktionalität von try/catch läßt sich definitiv
NICHT mit Makros nachbilden.
-
e.lienen schrieb:
[*]Kann ich in C ein try/catch nachbilden?
mit setjmp() und longjmp(), aber was hat das mit deinem problemchen zu tun?
-
Javaner schrieb:
Die volle Funktionalität von try/catch läßt sich definitiv
NICHT mit Makros nachbilden.das stimmt, aber das hier ist sehr nah dran
-
supertux schrieb:
Javaner schrieb:
Die volle Funktionalität von try/catch läßt sich definitiv
NICHT mit Makros nachbilden.das stimmt, aber das hier ist sehr nah dran
Hey, doch noch gefunden! Hehe, da hast du aber lange gesucht!
-
Aaalso:
da ich an diesen TRY und CATCH dingern interessiert bin habe ich folgendes getestet:#include <stdio.h> #include <excpt.h> #include <windows.h> #define TRY struct exception* c__ex = NULL; #define CATCH c__ex_handler: if (c__ex) #define THROW(e) { c__ex = e; goto c__ex_handler; } #define FINALLY int main() { int a[1]; printf( "Fangen einer AccessViolation." ); TRY{ printf( "inTry:\n" ); a[2] = 1; } CATCH{ printf( "error" ); } }
Und siehe da, windows kommt daher und fragt mich "Programm Debugen, Beenden oder auf Programm warten?";
Ich würds geil finden wenns geht, aber bin wohl zu doof xD
Sind "defines" Makros?
-
lippoliv schrieb:
Sind "defines" Makros?
So etwas hier ist ein Makro:
#define ADDIERE(x,y) x+y int main() { int i=ADDIERE(1,2); }
Das hier würde ich eher als Präprozessor-Konstante bezeichnen:
#define PI (3.1415926535897932384626433832795028841971693993751)
#defines sind nur Textersetzungen, die vor dem Kompilieren stattfinden (und deshalb auch sehr unsicher).
-
Ok danke... Jetzt versteh ich das ein wenig...
-
_matze schrieb:
Hey, doch noch gefunden! Hehe, da hast du aber lange gesucht!
nein, habe ich nicht. Ich musst im anderen Forum fragen, ob jemand noch weiß, wo es war, denn nach 30 Minuten konnte ich nichts finden
Schande über mich.
_matze schrieb:
#defines sind nur Textersetzungen, die vor dem Kompilieren stattfinden (und deshalb auch sehr unsicher).
naja, Makros wie ADDIERE sind auch Textersetzungen. Und inwiefern sagst du, dass Makros sicher und unsicher sind?
-
lippoliv schrieb:
Aaalso:
da ich an diesen TRY und CATCH dingern interessiert bin habe ich folgendes getestet:#include <stdio.h> #include <excpt.h> #include <windows.h> #define TRY struct exception* c__ex = NULL; #define CATCH c__ex_handler: if (c__ex) #define THROW(e) { c__ex = e; goto c__ex_handler; } #define FINALLY int main() { int a[1]; printf( "Fangen einer AccessViolation." ); TRY{ printf( "inTry:\n" ); a[2] = 1; } CATCH{ printf( "error" ); } }
Und siehe da, windows kommt daher und fragt mich "Programm Debugen, Beenden oder auf Programm warten?";
Ich würds geil finden wenns geht, aber bin wohl zu doof xDzugriffe abfangen über array-grenzen hinaus und ähnlich schlimme dinge kannst, du damit nicht. sowas muss das OS (die programmiersprache ist dann fast egal) oder die virtual machine (Java, .NET, z.b.) unterstützen. exceptions ohne systemunterstützung sind ziemlich sinnlos weil sie immer selbst selbst 'geworfen' werden müssen (siehe das THROW makro).
-
Dann bringt mir also das try, sonstwas ding nicht viel, denn ich möchte "AccessViolation" gerne selber behandeln können xD
Die restlichen Dinge klären sich früher oder später von selbst.Danke trotzdem, und danke für die genauere erläuterung, macht sinn.
-
supertux schrieb:
_matze schrieb:
Hey, doch noch gefunden! Hehe, da hast du aber lange gesucht!
nein, habe ich nicht. Ich musst im anderen Forum fragen, ob jemand noch weiß, wo es war, denn nach 30 Minuten konnte ich nichts finden
Schande über mich.
Genau, Schande über dich!
Schön, dass du da soviel Zeit investiert hast.
supertux schrieb:
_matze schrieb:
#defines sind nur Textersetzungen, die vor dem Kompilieren stattfinden (und deshalb auch sehr unsicher).
naja, Makros wie ADDIERE sind auch Textersetzungen. Und inwiefern sagst du, dass Makros sicher und unsicher sind?
Damit meinte ich alle defines (ob jetzt Makro oder Konstante).