Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Frage zu Prozessen/Threads

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fragender:-)
Gast





BeitragVerfasst am: 27. Apr 2006 8:55   Titel: Frage zu Prozessen/Threads

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
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 27. Apr 2006 12:07   Titel: Re: Frage zu Prozessen/Threads

Fragender:-) hat folgendes geschrieben::
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.
 
Benutzer-Profile anzeigen Private Nachricht senden

Fragender:-)
Gast





BeitragVerfasst am: 27. Apr 2006 13:51   Titel: 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
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 27. Apr 2006 14:12   Titel: Re: Frage zu Prozessen/Threads

Fragender:-) hat folgendes geschrieben::
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.

Zitat:

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy