Wie implementiert man (char-ready?) in C

8

Ich implementiere zur Zeit Scheme R5RS in C, und ich versuche, die (char-ready?) Funktion zu implementieren.

Ich habe die Spezifikationen für die unten angegebene Funktion. Die Funktion wird garantiert nicht blockiert. Die Standard-C-Funktionen wie fgetc () blockieren alle auf Eingaben, wenn sie aufgerufen werden, wenn keine Eingabe bereit ist.

Weiß jemand, ob es eine Möglichkeit gibt, das auf einfache Weise zu implementieren, ohne einen dedizierten IO-Thread zu erzeugen?

Bearbeiten: Mein Eingabestreamtyp ist eine FILE *, die stdin oder eine mit fopen () geöffnete Datei sein kann.

  

(char-ready?) Verfahren

     

(char-ready? Port) Prozedur

     

Gibt #t zurück, wenn ein Zeichen am Eingabeport bereit ist und andernfalls #f zurückgibt. Wenn char-ready #t zurückgibt, wird garantiert, dass die nächste read-char-Operation an dem gegebenen Port nicht hängen bleibt. Wenn der Port am Ende der Datei ist, dann char-ready? gibt #t zurück Der Port kann weggelassen werden. In diesem Fall wird standardmäßig der Wert zurückgegeben, der von current-input-port zurückgegeben wird.

     

Begründung:

     

Char-bereit? existiert, um es einem Programm zu ermöglichen, Zeichen von interaktiven Ports zu akzeptieren, ohne dabei auf Eingaben warten zu müssen. Alle Eingabeeditoren, die solchen Ports zugeordnet sind, müssen sicherstellen, dass Zeichen, deren Existenz von char-ready bestätigt wurde kann nicht ausgerieben werden. Wenn char-bereit? Um #f am Ende der Datei zurückzugeben, wäre ein Port am Ende der Datei nicht von einem interaktiven Port zu unterscheiden, der keine Ready-Zeichen hat.

    
Marc O'Morain 01.06.2011, 19:56
quelle

3 Antworten

5

Sie müssen unter die stdio-Ebene gehen. Unter UNIX können Sie fileno() verwenden, um den dem Stream zugeordneten Dateideskriptor abzurufen, und anschließend können Sie die Aufrufe von select() und read() für nicht blockierende Lesevorgänge verwenden.

    
zvrba 01.06.2011, 20:28
quelle
2

Vielleicht würde diese Lösung für Sie funktionieren: How um zu überprüfen, ob stdin noch geöffnet ist, ohne zu blockieren?

    
Bill Lynch 01.06.2011 20:04
quelle
2

Vielleicht so etwas wie der Code in diese Antwort ? Aber beachten Sie mit ungetc "nur ein Pushback ist garantiert".

Als Nebenbemerkung führen die meisten ernsthaften Schema-Implementierungen ihre eigenen gepufferten (möglicherweise nicht blockierenden) IO durch.

    
Eli Barzilay 01.06.2011 20:06
quelle

Tags und Links