mikrocontroller.net

Forum: Compiler & IDEs Funktionsweise select, FD_ISSET, FD_SET


Autor: Para (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Alles Gute für 2018 wünsche ich erstmal!

Könnte mir bitte jemand verständlich erläutern, wie select, FD_SET und 
FD_ISSET funktionieren? Und zwar mehr, was in den Funktionen selbst 
passiert, so dass man diese "nachbilden" kann.. ?!

Danke & Grüße
Para

Autor: Markus F. (mfro)
Datum:

Bewertung
4 lesenswert
nicht lesenswert
Para schrieb:
> so dass man diese "nachbilden" kann..

das macht man am besten gar nicht.

select() war vom ersten Augenblick an eine Fehlkonstruktion (so ähnlich 
wie die Begrenzung von MS-DOS auf 640 KB, weil man "nie" mehr braucht).

select() "lauscht" auf eine (begrenzte) Zahl von File-Deskriptoren und 
kehrt zurück, wenn auf einem von ihnen "was passiert" ist.

Dummerweise ist der höchste mögliche Wert eines solchen File-Deskriptors 
in der Implementierung festgenagelt und reicht praktisch bei allen 
aktuellen Betriebssystemen längst nicht mehr aus. Eine Änderung 
erfordert das Neukompilieren aller Nutzer der Library.

Wenn Du so was "basteln" willst, nimm' dir lieber poll() als Vorbild. 
Das macht praktisch dasselbe. Allerdings ohne Designfehler.

Autor: Para (Gast)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
:-((((

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Para schrieb:
> :-((((

????

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Para schrieb:
> Und zwar mehr, was in den Funktionen selbst passiert, so dass man diese
> "nachbilden" kann.. ?!

Du könntest damit anfangen, Dir den Quelltext davon anzuschauen.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Para schrieb:
> Und zwar mehr, was in den Funktionen selbst
> passiert, so dass man diese "nachbilden" kann.. ?!

Wird bei select() Funktionen eher schwierig, da sie im Kernel 
stattfinden. Viel Spass da den Code zu lesen...

FD_SET und FD_ISSET sind IMHO nur C-Markros, d.h. da muss man halt den 
entsprechenden Header studieren.

Aber auch ich würde lieber poll() einsetzen, wenn der Code nicht auf 20 
Jahre altem Unix arbeiten muss.

Autor: Clemens L. (c_l)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Jim M. schrieb:
> Wird bei select() Funktionen eher schwierig, da sie im Kernel
> stattfinden. Viel Spass da den Code zu lesen...

Die Implementation von select() ruft poll() auf:
https://git.kernel.org/pub/scm/linux/kernel/git/to...

Was dann beim Gerätetreiber ankommt, sieht wieder anders aus:
https://lwn.net/Kernel/LDD2/ch05.lwn#t3

Siehe auch:
http://pubs.opengroup.org/onlinepubs/9699919799/fu...
https://stackoverflow.com/questions/970979/what-ar...

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Clemens L. schrieb:
> Jim M. schrieb:
>> Wird bei select() Funktionen eher schwierig, da sie im Kernel
>> stattfinden. Viel Spass da den Code zu lesen...
>
> Die Implementation von select() ruft poll() auf:
> https://git.kernel.org/pub/scm/linux/kernel/git/to...
>
> Was dann beim Gerätetreiber ankommt, sieht wieder anders aus:
> https://lwn.net/Kernel/LDD2/ch05.lwn#t3
>
> Siehe auch:
> http://pubs.opengroup.org/onlinepubs/9699919799/fu...
> https://stackoverflow.com/questions/970979/what-ar...

Und für die Windows-Funktionsweise von select() könnte man einen Blick 
in die Quellen von ReactOS werfen.

Autor: Strubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Um poll()-Mimik nachzubauen muss man nicht zwingend die Kernelsourcen 
durchackern, siehe Doku zum Stichwort 'wait queues'.
Im Prinzip wird nach dem poll() der aktuelle Task vom Scheduler 
schlafengelegt und wieder aufgeweckt, wenn der Treiber Daten hat, 
inzwischen darf ein anderer Task ran.
Dafür musst du halt irgend ein Framework/RTOS bemühen oder nen hack a la 
protothreads..

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.