Hallo,
Überprüfen Sie bitte Ihre Mitteilung! Sie ist zu lang (maximal 12288 Zeichen).
Ja sowas!
Hoehoe ;-) Fass dich halt kuerzer *g*
Liegt wohl daran, daß der Konqueror (2.2.2) die Tabs in je 8 Leerzeichen beim C&P in ein Textarea umwandelt. Nach Löschen derselben reichte es dann.
Naja, vielleicht doch mal auf 3.0.1 updaten ;-)
Ist ja nur noch getpid()
Ein eindeutiges Merkmal gibt es z.B. mit tmpnam() bzw tmpfile()
Oh, kannte ich auch noch nicht. Mal sehen, was die man-Page sagt:
BUGS
These interfaces are provided for System V and ANSI compatibility only.
The mkstemp(3) interface is strongly preferred.
[...]
Vor allen Dingen der erste Punkt macht mich stutzig; eine race condition kann
ich echt nicht brauchen. Weisst du naeheres darueber?
Nein, ich benutze sie auch nicht, da es hin und wieder (warum eigentlich wieder? Lernen die denn nicht aus ihren Fehlern? ;-) Bugs in den Implementationen gibt, speziell in der GNU-Libc.
Baue mir sowas dann immer selber. (meist mit einer Ck32 oder mk5 Checksum über das eigene Binary).
Ich glaueb aber immer noch daran, daß der Part überhaupt nicht nötig ist und gänzlich vermieden werden kann.
Habe aber leider erst heute Abend wieder Zeit. Werde mich dann näher mit dem Problem beschäftigen.
Kannst Dein malloc() an den meisten Stellen eh ganz weglassen.
Sicher, aber dann muesste ich mit festen Groessen arbeiten (Arrays), und
das moechte ich moeglichst vermeiden. So kann ich die Groesse ziemlich
genau bestimmen.
Nein, warum? Pointer reichen. Damit kann auch keine Ärger mit der Größe
auftauchen.
Bitte was?
Entschuldige, aber wie soll ich hier sonst einen String zusammensetzen? ;-)
Warum willst Du denn den String zusammensetzen?
und weder strcpy() noch strcat() sind eigentlich zu empfehlen.
Warum?
strcpy() weil in Deinem Fall tempfile = cfile (+ der danach notwendigen
Änderungen) besser gewesen wäre, hätte auch die Speicherallokation
gespart. (Nur die Adresse wird kopiert)
Aber dann haette ich die Zahl wieder hinten dran gehabt, und auch haette
ich das Problem, dass evntl. die Laenge zu gross wird.
Wieso kann die Länge zu groß werden? Sind doch nur Zeiger. Im Normalfall
decken die die ersten 4GB auf jeden Fall ab. Sind sogar individuell, da
sparst Du Dir noch das getpid().
Naa. Ich meinte, die Groesse des Speicherfeldes koennte zu kein sein fuer ein
getpid() und den Namen davor.
Nein, das brauchst Du nicht mehr. Der Wert des Pointers selber ist hier individuell.
Dann schreib das doch einfach ;-)
'\0' sind drei Buchstaben mehr *jammer* ;-)
Und ich dachte, ich wäre faul ;-)
Na hoer mal, ob ich '\0' tippe (Shift+#, Alt GR+ß, 0, Shift+#) oder ob ich nur
0 tippe, das ist ein grosser Unterschied ;-)
GCC nimmt auch ' (accent degue? Ich hatte kein Französisch, zumindest nicht als Sprache ;-) spart dann einen Tastenhieb ;-)
ANSI C sagt ja nur:
(stddef.h)
NULL which expands to an implementation-defined null pointer constant
In stddef.h steht dann auf meiner Maschine:
#define NULL ((void *)0)
Na gut. Solange das im Ergebnis einen falschen Ausdruck gibt (also einen
Ausdruck, der false ergibt), kann das meinetwegen eine Warnung geben.
Gibt jetzt trotz dem keine Warnung mehr. Habe ich mich wohl irgendwo vertippelt. Bitte entschuldige die unnötige Aufgeregtheit meinerseits.
(Eigentlich darf time() da keine Probleme machen. Ist meine Libc wirklich
so kaputt?)
Was fingerst du da auch drin rum? ;-)
Hab ich gar nicht! *heul* ;-)
Welches System eigentlich?
Linux 2.2.7cz (entspricht ungefähr 2.2.18 mit ein wenig aus der 2.4 Reihe) mit GLibc 2.0.undeinbischen
Die alte Glibc hinderte mich übrigens daran Mozilla 1.0.0 zu bauen (Die benutzen sendfile(), das gibt es erst seit 2.2.x und ich hatte noch keine Lust, es nachzubauen)
Och nö, geht mittlerweile. Arbeitet sauber.
Wenn der Code auch sauber ist! ,-)
Mittlerweile heisst?
Mittlere Optimierung (-O2 beim GCC) eigentlich schon seit den älteren egcs. Spätestens seit 2.95.2 ergibt auch -O3 keine Probleme mehr.
Selbst Dein von Dir so verabscheutes Loop Unrolling funktioniert tadellos ;-)
Wenn der Code sauber ist!
Keine schmutzigen Tricks, kein gar nichts, pures ANSI C!
[...]
Such Dir was aus, sind alle dort beschrieben ;-)
Ja, danke, das hab ich verdient. ;-)
Aber -O2 beim GCC muß immer gehen, sonst stimmt etwas im Code nicht.
Ja, es gibt mit Sicherheit auch Ausnahmen, aber mir fallen im Augenblick keine ein und ob Deine einfach gehaltenes (Nicht abschätzig gemeint! Beileibe nicht! Einfach ist seltenst schlecht!) Stückchen Code darunter fällt, wage ich doch ernsthaft zu bezweifeln.
Wieso?
Zugegeben, es mag vielleicht keine Loesung im C-Style sein. Aber sie ist
doch einfach und elegant?
Mpfffff...
Öh ...
Klarer Fall von Perl2C ;-)
Hoe?
Nein, mal im ernst, was hast du fuer Probleme mit der Loesung?
Diese Mehrfachbenutzung von Speicher für verschieden Typen ist typisch Perl. Da geht das nicht nur, da ist das durchaus sogar als geschickt anzusehen.
Hier aber nimmst Du dem Compiler die Möglichkeit einen einfachen Integer im Prozessorregister zu halten. Ein Geschwindigkeitsunterschied von etwa Faktor 1.000. Nur um 4 Byte zu sparen? Also, ich weiß ja nicht ;-)
Reicht das denn nicht "at compile time"?
Mich ärgern hardcompiled paths ja auch unsäglich, aber hier?
Na, aber wie soll ich dann vorkompilierte Binaries anbieten? Waere ja geradezu
sinnlos.
Achja, die vergesse ich immer. (Die einzigen Binaries hier sind eine alter Netscape und der Realplayer und die beiden laufen im chroot() Knast ;-)
Mmh...
Wie wäre es mit einer Environment Variablen?
getenv() ist ISO und auch schon bei Dir in Benutzung.
Und ein gutes Stück schneller, als die Dateihangelei!
Man, man, man. Ich habe noch gelernt, es gibt nur 0 (false) oder
ungleich 0 (true) und erst mit C++ sei bool eingefuehrt worden.
Auch erst seit C99, also ein gutes Stück nach C++.
splint http://www.splint.org mit der Option -strict.
Aber tu Dir das bloß nicht an! ;-)
Ich glaub, ich hab das oefter mal noetig ;-)
Dsa mag sein, aber bestimmt nicht mit der Option -strict. Da schmeißt selbst ein völlig korrektes "Hello World" Warnungen raus ;-)
#include <stdio.h>
#include <stdlib.h>
int main(void){
if ((printf("Hello World")) > 0 ){
exit(EXIT_SUCCESS);
}
else {exit(EXIT_FAILURE);}
}
bash-2.02$ splint -strict test.c
Splint 3.0.1.6 --- 16 Apr 2002
test.c: (in function main)
test.c:6:6: Called procedure printf may access file system state, but globals
list does not include globals fileSystem
A called function uses internal state, but the globals list for the function
being checked does not include internalState (Use -internalglobs to inhibit
warning)
test.c:6:6: Undocumented modification of file system state possible from call
to printf: printf("Hello World")
report undocumented file system modifications (applies to unspecified
functions if modnomods is set) (Use -modfilesys to inhibit warning)
Finished checking --- 2 code warnings
Na, noch Fragen? ;-)))
Warum meinst Du eigentlich, das eine PID bis zu 1024 Stellen haben
kann? Nur so als Frage ;-)
Wer sagt, dass ich das meine? ;-)
Ich verwende 'buff' noch etwas spaeter, als fread()-Buffer.
Wie ich schon weiter oben erwähnte:
Jaja, typisch perl2C ;-)
Hae? Erklaren Sie sich! ;-)
Vieles, was bei Perl funktioniert, klappt auch in C.
Ist in C aber nicht immer und unbedingt von Vorteil ;-)
BTW:
stdio.h
- Macro: int BUFSIZ
[...]
Ja, ich weiss. Aber ich finde 1k-Bloecke irgendwie schoener ;-)
Gib dem Compiler doch die Möglichkeit zur Optimierung. BUFSIZ ist wirklich schon beim GLibc Bau genau auf die Möglichkeiten von Kernel und Architektur abgestimmt worden.
(ja, ich weiß: wer baut schon seine (G)Libc selber ;-)
so short
Christoph Zurnieden