Ponto schrieb:
Das Buch "Advanced Programming in the Unix Environment" ist ganz gut. Genauso die "Unix Network Programming" Bücher. Das Buch "Linux/Unix Systemprogrammierung" ist auch gut und sollte sowas drin haben.
Ich werd mal schauen, ob ich mir davon eins zulegen werde.
Ponto schrieb:
"man 2 signal" gibt dir eine Liste von erlaubten Funktionen im Signalhandler.
In einem signalhandler kann man viel falsch machen. Zum Beispiel beim Aufruf von waitpid sollte man aufpassen.
Ach verdammt. Ich hab in den Umgebungsvariablen die Sprache auf Deutsch stehen. Hab mich gewundert, warum da dazu nichts drin steht. Die deutsche Version ist vom 10. Juni 1996. Hab jetzt gerade in die englische Version geschaut. Die ist vim 28. April 2000. Und da steht tatsächlich auch so einiges mehr drin.
Das ist ja schon fast grob fahrlässig, die deutsche Version der Man-Pages zu nehmen, wenn die schon so lange nicht mehr übersetzt wurden...
Ich danke schonmal für die Hilfe. Ich werd mir überlegen, ob sich das Problem irgendwie umgehen lässt. Da das Programm eh so lange, wie mein Programm laufen soll, werde ich wohl einfach einen Timer setzen und jede Sekunde prüfen, ob es noch läuft. Ist nur leider nicht so schön.
Hallo,
Ich bin neu bei C++ und Linux. Nach einigen Tagen kann ich nun Nachrichten schreiben und empfangen über die serielle Schnittstelle. Leider will mein read-Befehl die Anzahl der Bytes die er lesen soll und das ist immer verschieden. Kann man nicht vorher schon im Speicher nachschauen, wieviel Bytes da sind? Oder vielleicht nach einem Steuerzeichen Ausschau halten, dass das ganze abbricht? Wenn sich mein select meldet kann ich ja als erstes nach der Anzahl schauen, oder? Ich habe das hier gefunden:
int bytes_to read;
bytes_to_read = m_RxQueue.SpaceFree();
Nur leider funzt das ned und ich weiß auch nicht in welcher Bibliothek das stehen soll und wie es sich vielleicht geändert hat. Das wäre eine große Hilfe...
danke
MArkus
GNU-Fan schrieb:
Herr jth schrieb:
Meine Idee war jetzt nämlich eine Abfrage zu machen, in der Art "Wenn Blockgröße kleiner als 1024, reserviere auf dem Stack, wenn größer auf dem Heap", die Frage ist jetzt welcher Wert sinnvoll wäre, da ich malloc eigentlich nur benutzen möchte wenn es nicht anders geht, aus Performance- und Verwaltungsgründen.
Hallo,
dein Streben nach Performance in allen Ehren, aber bist du dir sicher, auch am richtigem Punkt anzusetzen? Du misst doch hoffentlich den Leistungsgewinn auch wirklich nach.
Hi,
zugegeben, ich messe z.Z. nur etwas esoterisch mit time nach und mittle das über 5 Aufrufe. Prinzipiell hast du recht, zumal diese Funktion nur 1x pro Dateitransfer aufgerufen wird, d.h. eher selten.
Aber generell finde ich die Frage nicht ganz uninteressant, gerade wenn man eine Funktion hätte die öfters z.B. in einer Schleife aufgerufen wird. Den Speicher einfach auf dem Stack zu reservieren ist wesentlich weniger Verwaltungsaufwand für den Kernel und man hat hinterher auch kein Problem mit vergessenen free()s, da automatisch freigegeben wird sobald die Funktion wieder verlassen wird.
Die Frage für mich ist jetzt in welchem Rahmen man das noch machen kann ohne den Stack zu sprengen, ob es da auf Linux oder *BSD irgendwelche festen Werte gibt wie groß der Stackframe sein darf etc.
Hallo,
ich weiss zwar immer noch nicht warum sigaction bei mir nicht funktioniert (hab es mittlerweile in anderen Programmen auch ausprobiert, aber werde wohl mal ein Signal Tutorial lesen muessen.
Mittlerweile habe ich folgenden Ansatz der zu funktionieren scheint:
vor dem for( ; ; ) [bei mir while(1)] habe ich folgende Zeilen eingefuegt und obigen Code der mit sigaction zu tun hat geloescht, die handler() ist unveraendert.
// ...
if(SIG_ERR == (signal(SIGCHLD, handler)){
perror("signal failed");
exit(1)
}
for(;;){
// ...
Seltsam, aber damit kompiliert der Code.
Danke erstmal für die Antworten.
Ich frage mich genau das selbe wie ".....". Hab eigentlich vermutet das man EPOLLHUP zurück bekommt wenn die Verbindung unterbrochen wird. Aber ok, wenn das normal ist geht das auch so.
Hab das rausgekramt hier und gerade ausprobiert, ich glaube es muss WIFSIGNALED() heissen
entelechie schrieb:
hm.
WIFSIGNALED (*status) : wahr, genau dann, wenn das Kind duch ein Signal beendet
lagalopex schrieb:
Guck doch verdammt noch mal in die man-pages!!!
Hast recht, stand alles drin, habe zu voreilig im forum geschrieben..!
Sry und nochmals DANKE..!
Kannst Du mal versuchen, meine ungültige Adressenmeldung und Dein Verhalten zusammen-zu-interpretieren? Es ist anzunehmen, das Speicherbereiche unerlaubt überschrieben werden und dieses nichtdeterministische Verhalten erzeugt.
Hallo,
hat sich erledigt, ich hab mich mal wieder selbst ver*****t
Kylix' interner Debugger hat zugeschlagen und die Rückgabewerte verändert. Und da ich das Programm immer aus der IDE gestartet habe, hab ich halt die falschen Werte bekommen. Ohne Debugger tut das Programm auch was es soll...
mfG, Nix
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?
Dieses Posting wurde automatisch erzeugt.
Hallo,
mir leuchtet mittlerweile ein, warum es nicht gehen kann - saemtliche Funktionen die bspw schon mal ein kalloc() oder skb_alloc() verwenden, allokieren ja spaetetens schon mal Speicher im Kernel Space. Da Linux ja diesen strikt vom User Space trennt, also dem Addressraum in dem die Applikationen zu laufen haben, werde ich wohl meinen "Test-Code" direkt als Modul kompilieren und den entsprechenden Kernel patchen muessen.
Manchmal dauert es etwas bis man merkt, dass man einfach nur irgendwie auf der Leitung steht.
LordJaxom schrieb:
Wenn jemand die Bibliothek "pthreads" für Windows anbieten würde, dann sollte Dein Programm sogar unter dem Kernel NT 5.0 laufen.
Geht tatsächlich: http://sourceware.org/pthreads-win32/