Non-Canonical...was mache ich falsch?

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Non-Canonical…was mache ich falsch?
Hey.

Ich komm bei Aufgabe9 einfach nicht mehr weiter. Ich habe die Umstellung der Konsole wie im Skript beschrieben in das Programm implementiert.

Habe ich es nun richtig verstanden, dass jedes Zeichen, dass man beim Erzeuger eintipt SOFORT vom Verbraucher angezeigt werden soll?

Wenn ja: Warum geht es bei mir nicht? Wie gesagt, wie im Skript umgestellt, es gab auch keine Fehler dabei. Hat jemand Tips, Infos oder gibt es bekannte Fallen, die ich nicht kenne?

Danke schonmal :slight_smile:


cc[VMIN] auf 1 gesetzt?
macht der Verbraucher putchar? Wenn ja, das puffert zeilenweise
in der stdio-libraryfunktion. Um den Puffer rauszuschreiben muss
man fflush(stdout) aufrufen.

Wenn das auch nicht reicht wuerde ich erst mal die Treiberumstellung
mit einem ganz einfachen Programm alleine testen:
Treiber auf non-canonical stellen.
while getchar { putchar; fflush}

Wenn das funktioniert aber mit dem erzeuger/verbraucher tut das
gleiche nicht, dann kann auch noch ein Fehler in der Koordinierung
drin sein.


Wunderbar, danke!! Ein simples fflush(stdout) hat gelangt :cheesy:


nach der manpage von termios zu urteilen sollte es bei der 9c ja reichen, VMIN = 0 und VTIME = 5 zu setzen. Das aberwitzige dabei ist, dass, sobald ich im Erzeuger ein Zeichen eingebe, der Verbraucher es alle 0,5 Sekunden ausgibt. Also entweder spinnt der Verbraucher oder der Erzeuger schreibt tatsächlich alle 0.5 Sekunden das eingebene Zeichen an die nächste Speicherstelle. Sobald ich ein weiteres Zeichen eingebe, macht er das gleiche mit dem neuen Zeichen. was läuft da schief?


Man muss den VMIN Wert möglichst hoch ansetzen. VMIN steht wohl über VTIME. Das heißt: VMIN=1 => Nach einem Zeichen wird auf jeden Fall übergeben. VMIN=2 => Sobald 2 Zeichen getipt wurden wird auf jeden Fall übergeben!!

Also VMIN so setzen, dass man diesen Wert auf keinen Fall in 0,5Sekunden erreichen kann.


is ja logisch… :-p hab ich wohl aweng falsch gedacht gestern… danke!


Gilt die Terminal-Einstellung non-canonical eigentlich auch für die Ausgabe von Zeichen? Also könnte ich mit ~ICANON auch den Verbraucher auf ungepufferte Zeichenausgabe umstellen?


Noe, bei der Ausgabe puffert jemand anderes.
Bei der Ausgabe puffern nur die stdio-Funktionen der C-Library
(also printf, putchar und so). Das Betriebssystem puffert nichts
mehr wenn’s die Zeichen mal hat.
Also entweder man ruft direkt write auf oder man sagt mit fflush(stdout)
dem stdio-Modul dass es rausschreiben soll (z.B. nach jedem putchar).


Du kannst auch die Ausgabe auf ungepuffert stellen, aber nicht am Terminaltreiber. Die Funktion heisst, glaub ich,

setvbuf(...);

Hab jetzt leider kein Linux zur Hand, um das zu checken oder die Argumente rauszusuchen… Guck mal in die Manpage!