Frage zu Prozessen/Threads

Post Reply
Message
Author
Fragender:-)

Frage zu Prozessen/Threads

#1 Post by Fragender:-) »

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

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

Re: Frage zu Prozessen/Threads

#2 Post by Janka »

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?
Mit select und nichtblockierendem Lesen. Könnte aber mit der Tastatur und stdio-Aufrufen Probleme machen.

Ansonsten mit Threads.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Fragender:-)

Re: Frage zu Prozessen/Threads

#3 Post by Fragender:-) »

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

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

Re: Frage zu Prozessen/Threads

#4 Post by Janka »

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?
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.

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.
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.
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.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Post Reply