Hallo Tux-Freunde:-)
Ich habe folgende Frage:
Ich bim am Schreiben eines C-Pogrammes, welches von diversen seriellen Schnittstellen Daten einliest und in Files loggt. Soweit so gut. Nun möchte ich das Proggi erweitern, so dass ich während des loggens auch noch Tastaturabfragen, z.B. um Daten an bestimmte Schnittstellen zu versenden.
Zuerst habe ich mir den Befehl scanf angeguckt. Problem: blockiert bis eine Zeichenkette eingegeben wurde, das Logging würde unterbrochen. Mit getc ist das gleiche Problem. Allenfalls würde ein read von stdin funktionieren, habe ich mir nicht mehr genauer angeschaut.
Wie würdet ihr diese Aufgabe lösen?
Das Programm irgendwie in Threads/Prozesse aufteilen; einer für's Logging und der andere für die Tastatureingaben? Welches sind die relevanten Befehle dazu?
Andere Vorschläge?
Vielen Dank auch
fb
Frage zu Prozessen/Threads
Re: Frage zu Prozessen/Threads
Mit select und nichtblockierendem Lesen. Könnte aber mit der Tastatur und stdio-Aufrufen Probleme machen.Fragender:-) wrote:Hallo Tux-Freunde:-)
Ich habe folgende Frage:
Ich bim am Schreiben eines C-Pogrammes, welches von diversen seriellen Schnittstellen Daten einliest und in Files loggt. Soweit so gut. Nun möchte ich das Proggi erweitern, so dass ich während des loggens auch noch Tastaturabfragen, z.B. um Daten an bestimmte Schnittstellen zu versenden.
Zuerst habe ich mir den Befehl scanf angeguckt. Problem: blockiert bis eine Zeichenkette eingegeben wurde, das Logging würde unterbrochen. Mit getc ist das gleiche Problem. Allenfalls würde ein read von stdin funktionieren, habe ich mir nicht mehr genauer angeschaut.
Wie würdet ihr diese Aufgabe lösen?
Ansonsten mit Threads.
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.
Re: Frage zu Prozessen/Threads
Vielen Dank für die schnelle Antwort. Ich habe mir pthreads angeschaut und ein kleines Versuchsprogramm getippt, welches 5 Threads (den gleichen) generiert. Der Thread ist eine Endlosschlaufe mit einer "Hallo Welt" Ausgabe und einem sleep(2). Der 2-Sekunden-Sleep scheint aber nicht ausgefürt zu werden. Sind gewisse Aufrufe aus Threads verboten? Muss ich selbst absichern, dass die gleiche Routine (sleep in diesem Falle) nicht aus verschiedenen Prozessen aufgerufen wird (Sempahore)? Ich nehme aber einmal an, sleep sollte reentrant programmiert worden sein. Leider konnte ich dazu nichts ergoogeln.
Danke 1000
fb
Danke 1000
fb
Re: Frage zu Prozessen/Threads
Verboten nicht. Es kann halt bloß zu Fehlfunktionen führen. Es ist auch wichtig, welches Thread-System und welchen Kernel man nimmt. Beispielsweise gibt es die GNU pth-Bibliothek, die zwar vollkommen systemunabhängig funktioniert, dafür blockieren Systemaufrufe aber *alle* Threads, nicht nur den ausführenden.Fragender:-) wrote:Vielen Dank für die schnelle Antwort. Ich habe mir pthreads angeschaut und ein kleines Versuchsprogramm getippt, welches 5 Threads (den gleichen) generiert. Der Thread ist eine Endlosschlaufe mit einer "Hallo Welt" Ausgabe und einem sleep(2). Der 2-Sekunden-Sleep scheint aber nicht ausgefürt zu werden. Sind gewisse Aufrufe aus Threads verboten?
Mit einem neuen pthread und Linux-Kernel >= 2.4 bist du aber auf der sicheren Seite, hier wird nur der aufrufende Thread blockiert.
Warum wird das sleep() nicht ausgeführt: sleep() funktioniert über Signale - da gibt es aber eine gewisse Abhängigkeit mit den Threads, weil normale Signale immer nur an den gesamten Prozess, nicht aber an Threads gesandt werden können. Das solltest du dir (wo auch immer du geguckt hast) mal genauer durchlesen.
Nein, mit Reentranz hat das nichts zu tun. Das ist relevant bei vielen stdlib-Aufrufen, die Zeiger auf Datenobjekte in der stdlib zurückliefern oder diese direkt manipulieren. Da diese Datenobjekte nur einmal vorhanden sind, darf logischerweise auch nur ein Thread daran herumspielen. Wenn man das mit mehreren Threads gleichzeitig machen will, muss man die _r-Aufrufe benutzen, denen man einen Zeiger auf ein für den Thread lokal definiertes Datenobjekt übergeben muss, dass dann von der stdlib benutzt wird.Muss ich selbst absichern, dass die gleiche Routine (sleep in diesem Falle) nicht aus verschiedenen Prozessen aufgerufen wird (Sempahore)? Ich nehme aber einmal an, sleep sollte reentrant programmiert worden sein. Leider konnte ich dazu nichts ergoogeln.
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.