Probleme bei Portierung Windows --> Linux (fork(), execl())



  • Folgendes Problem:

    Wenn ich unter Windows mit CreateProcess(...) einen Prozess erzeuge,
    dann wird für den neuen Prozess auch eine eigene Konsole erzeugt,
    alle Ausgaben, die ich mit fprintf(stdout, ...) im creierten Prozess mache, erscheinen auf der prozessspezifischen Konsole.

    Unter Linux ist das anders.
    Nach fork() und execl(...) wird hier für den creierten Prozess keine eigene Konsole erzeugt.

    Meine Frage:
    Was muß ich tun, damit auch unter Linux nach der Prozesserzeugung mit fork() und execl(...) für den creierten Prozess eine eigene Konsole erzeugt wird,
    damit die fprintf(stdout, ...) - Ausgaben in der prozessspezifischen Konsole erfolgen?

    Im voraus besten Dank für die Antworten.



  • Nicht ohne große zusätzlichen Arbeiten

    Denn was heißt "eine neue Konsole wird geöffnet"?
    Wenn du damit ein neues fenster meinst, dann funktioniert das so nicht mit der POSIX API.
    Denn POSIX kennt kein GUI. Unter windows ist das GUI-System fester bestandteil des systems (zu mindestens für Desktop systeme) und der Win32 API deshalb funktioniert es dort.

    Unter linux gibt es keine fixes GUI System, das immer da ist.
    Dein Programm könnte auch auf einem System gestartet werden, welches komplett ohne ein GUI system läuft (Rein mit einer textuellen "konsole")

    Die "Konsolen" unter einem Graphischen System (X11, Wayland) werden über "terminal" programme (z.b. xterm) bereitgestellt. Da gibt es dann pro xterm instanz ein Fenster

    Du müsstes das entsprechend verwendete "konsolen" Programm (z.b. xterm) als separaten prozess starten und dann darin dein "zweites" Programm starten um ein 2. Fenster zu bekommen


  • Global Moderator |  Mod

    Du meinst ein neues Terminalemulatorfenster? Dann spawne nicht direkt dein gewünschtes Kindprogramm, sondern einen neuen Terminalemulatorprozess, der dann das gewünschte Kommando ausführt.

    Mit fork/exec bist du sehr low-level auf der Ebene unterwegs, wie das Betriebssystem Prozesse verwaltet. Fenster und Konsolen sind auf der Ebene unbekannt. Das kommt später, auf der vom Betriebssystem unabhängigen Benutzeroberfläche. Daher mag obiges etwas umständlich erscheinen. Es mag auch etwas direktere Mittel geben, sofern man auf der Ebene der Nutzeroberfläche arbeitet. Auf der Ebene ist es eventuell etwas einfacher, wenn man das Ziel "öffne ein Programm in einem neuen Fenster" ausdrücken möchte.

    Wobei bei Programmen, die rein auf Text über stdin/stdout mit dem Nutzer kommunizieren (das was man gemeinhin Konsolenprogramme nennt), sowieso noch ein weiteres Programm nötig ist, damit diese Kommunikation auch beim Nutzer ankommt. Eben das Terminal(emulator). Von daher kann es in diesem Fall gut sein, dass dein eigentliches Vorhaben nicht "öffne mein Programm in einem neuen Fenster", sondern "öffne mein Programm in einem neuen Terminalemulator" ist.

    Wenn das so ist, dass dein Ziel ist, ein neues Terminalemulatorfenster zu öffnen, dann fährst du mit dem ersten Vorschlag ganz oben schon genau richtig. Dann machst du das fork/exec und der Terminalemulator kümmert sich dann darum mit der Nutzeroberfläche über Fenster zu reden.



  • Hallo firefly,
    hallo SeppJ,

    erst mal Danke für die umgehende Beantwortung.
    Mit "Konsole" habe ich mich etwas ungeschickt ausgedrückt.
    Ich meinte, daß unter Windows für jeden Prozess, der mit CreateProcess creiert und gestartet wird, eine Eingabeaufforderung geöffnet wird.

    Wenn jetzt in jedem der gestarteten Prozesse
    fprintf (stdout, "ProzessID = %d\n", getpid());
    aufgerufen wird, dann wird für jeden der gestarteten Prozesse eine Eingabeaufforderung geöffnet, in der Eingabeaufforderung erscheint dann
    "ProzessID = <aktual ProzessID>

    Genau das gleiche möchte ich unter Linux auch haben.


  • Global Moderator |  Mod

    Das haben wir durchaus verstanden und auch beantwortet.