Autor Thema: Konsolen  (Gelesen 8030 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« am: 02. March 2015, 23:57 »
Hallo liebe Community,
ich implementiere gerade die Konsole(n). Mein Ziel ist es 12 sichtbare Konsolen zu haben und die restlichen sind sogenannte virtuelle Konsolen. Nur weiss ich jetzt nicht, wie man einem (Kind-)Prozess sagen soll, dass er jetzt auf einer anderen Konsole laufen soll.
Wie wird das z.B. bei Linux oder bei Tyndur gemacht?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. March 2015, 00:08 »
Moin,
eigentlich musst du den Programmen darüber nichts sagen. Bei linux schreibt ein Programm (ls z.B.) einfach auf seine stdout pipe. Was dann mit den Daten in der stdout pipe gemacht wird und ob es irgendwo angezeigt wird, regeln andere Programme. Das könnten ein Terminalprogramm und der Videotreiber übernehmen.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 03. March 2015, 08:50 »
Genau. Um das ein bisschen näher auszuführen: Denk daran, dass unter Unix Kindprozesse grundsätzlich alle offenen Filedeskriptoren vom Elternprozess erben (wenn für den Deskriptor nicht FD_CLOEXEC gesetzt ist). Außerdem ist stdin per Konvention Deskriptor 0, stdout 1 und stderr 2.

Wenn dein Kernel dem ersten Prozess also z.B. tty1 für alle drei Deskriptoren öffnet, dann werden alle Kindprozesse automatisch auch auf demselben Terminal laufen. Wenn ein Prozess das ändern will, muss er (ggf. zwischen fork() und exec(), wenn es den Elternprozess nicht betreffen soll) die Deskriptoren neu öffnen. Das kann man machen, indem man erst mit open() das neue Ziel öffnet und dann mit dup2() den passenden Deskriptor zuweist (und danach das close() für den Original-FD nicht vergessen, dass du ihn nicht leakst). Das ist das gleiche Prinzip, egal ob du Ausgabeumleitung in eine Datei machst, in eine Pipe oder eben das Programm auf einem neuen Terminal laufen lässt.

Das ist Unix. Man kann's natürlich auch anders machen, wenn man will.

Unter tyndur öffnet jeder neue Prozess im Moment console:/{stdin,stdout,stderr} und der Elternprozess teilt dem console-Service per RPC mit, was das für den neuen Prozess sein soll. Das will ich bei Gelegenheit aber auch etwas unixartiger machen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #3 am: 03. March 2015, 23:18 »
Danke für die Antworten, das hat mir sehr geholfen.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #4 am: 04. April 2015, 13:32 »
Mir ist noch eine Frage eingefallen.
Wie wird das unter Linux gehandelt, wenn mehr Programme etwas ausgeben, wie Konsolen vorhanden sind. Und woher weiß ein Programm, dass die Konsole, die es öffnet frei ist?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 04. April 2015, 15:48 »
Wenn unter Linux mehrere Programme auf dieselbe Konsole schreiben, dann ist das halt so. Hast du dich noch nie über Programme geärgert, die im Hintergrund laufen und deine Shell vollspammen? ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #6 am: 07. April 2015, 15:02 »
Unter Linux kann man ja tty1 bis tty6 anzeigen lassen. Was ist den mit den anderen? Wie werden die angezeigt?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 07. April 2015, 16:28 »
Moin,
die programme öffnen ja nicht eine konsole.
Wenn du ein "terminal-programm" startest, wird standardmäßig darin bestimmt eine shell ausgeführt. Beim fork der shell wird dann das steuerterminal vererbt und das programm, das du aus der shell startest, läuft im gleichen terminal d.h. /dev/tty ist für die shell und dein programm gleich. Dein terminal-programm nimmt einfach den text, der dort steht und zeigt ihn evtl. in einem fenster an.
Wechselst du mit Ctrl+Alt+Fn zu einem "fullscreen"-terminal passiert da das gleiche. Dann ist das für das programm, dass du z.B. in tty2 startest, /dev/tty eine umleitung zu /dev/tty2.
Was ich nicht weiß, ob die tty's auch von einem programm bzw. von welchem programm angezeigt/ das umschalten verwaltet werden. (von init?)


Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 12. April 2015, 01:48 »
Programme schreiben auf "Terminals". Das können virtuelle Terminals (ttyX), Pseudo-Terminals (ptyX), serielle Terminals ("echte" Terminals), oder sogar an Telefonleitungen angeschlossene Modems sein, die man dann anrufen kann. Pseudo-Terminals werden ständig erzeugt und vernichtet, alle anderen Terminals bleiben dauerhaft erhalten. Diese werden von einem "getty"-Prozess verwaltet, der im Boot-Prozess gestartet (klassisch: in /etc/inittab definiert) und automatisch neu gestartet wird, wenn er endet.

Getty stellt die Schnittstelle ein: Baudrate, Flusskontrolle. Dazu für virtuelle Terminals (je nach Kernel) die Terminalemulation, für serielle Schnittstellen Datenformat und Parität, für Modems Modemtyp, Initialisierung, und so weiter. Danach startet das getty meist einen "login"-Prozess auf diesem Terminal, mit dem man sich auf diesem Terminal einloggen kann. Terminalmultiplexer oder -emulatoren erzeugen Pseudoterminals und starten darin das Programm selbst, meist eine Shell.

Der Linux-Kernel erzeugt beim Start keine virtuellen Terminals, sondern nur /dev/console. Die anderen virtuellen Terminals werden erst im Bootsystem erzeugt, wobei tty1 dann die console übernimmt.

 

Einloggen