brauche SCHNELL feedback bitte !! (läuft mein Programm unter Windwos?)



  • hdi schrieb:

    also ich meine z.B. bei UNIX muss man ja forken bevor man execlp aufruft, weil der prozess nicht zurückkehrt.

    sowas dummes wie 'forken' ist unter windows nicht nötig.
    🙂



  • mistgabel-fan schrieb:

    hdi schrieb:

    also ich meine z.B. bei UNIX muss man ja forken bevor man execlp aufruft, weil der prozess nicht zurückkehrt.

    sowas dummes wie 'forken' ist unter windows nicht nötig.
    🙂

    Unsinn!

    Die exec Familie ersetzt im aktuellen Prozess den Programmcode im Speicher mit dem Programmcode des mit exec* aufgerufenen Programms. Deswegen "kehrt" exec nicht zurück, weil der Prozess sofort ein anderer wird.

    Wenn man will, dass ein Programm ausgeführt wird, dann musst zuerst einen neuen Prozess erzeugt werden (wie in Windows mit CreateProcess) und das geschieht mit der man: fork(2) Funktion. Das Kindprozess kann man dann mit execlp "überschreiben" lassen und somit laufen beide Prozesse.

    @hdi:
    du kannst keine universelle Binary erstellen, du sowhl unter Windows als auch unter einem POSIX System läuft. Du musst also eine Binary für Windows und eine füre GNU/Linux erstellen.

    Damit man nicht 2 Sourcetrees zu pflegen braucht, benutzt den Preprozessor wie ansi-freak bzw. Don06 gepostet haben, wobei am besten wäre folgendes

    void clearConsole()
    {
    #ifdef WIN32
        System("cls");
    #else
        pid_t child;
        child = fork();
        if(child < 0) return;
    
        if(child == 0)
        { /* Child */
          execlp("clear" ,"clear", NULL);
          exit(1);
        }
        waitpid(child, NULL, 0);
    #endif
    }
    

    Der Nachteil ist, dass wenn das Systemziel 'clear' nicht hat oder 'clear' nicht im PATH gefunden wird, dann wird nichts ausgeführt. Es gibt allerdings eine Standard Lösung dafür, nämlich mit ANSI Escape Sequenzen. Dafür muss aber der Terminal ANSI Escape Sequenzen unterstützen. Mittlerweile findet man unter Unix Systeme nur solche Terminale, bei Windows nur wenn ansi.sys geladen wird, bei DOS bis Windows ME durch config.sys. Das sah so aus:

    DEVICEHIGH=C:\Windows\COMMAND\ANSI.SYS
    

    Wie man es heute bei Windows NT >4 geht, keine Ahnung.

    Jedenfalls kannst du sowas machen:

    void clearConsole()
    {
      printf("\033[2j");
      fflush(stdout);
    }
    

    //edit:

    Siehe http://en.wikipedia.org/wiki/ANSI.SYS und http://en.wikipedia.org/wiki/ANSI_escape_code

    Wenn ich es richtig lesen, muss man bei Windows NT folgendes tun:

    1. c:\windows\system32\config.nt erzeugen/editieren
    2. DEVICE=%SystemRoot%\system32\ANSI.SYS eintragen
    3. Restart



  • supertux schrieb:

    mistgabel-fan schrieb:

    hdi schrieb:

    also ich meine z.B. bei UNIX muss man ja forken bevor man execlp aufruft, weil der prozess nicht zurückkehrt.

    sowas dummes wie 'forken' ist unter windows nicht nötig.
    🙂

    Unsinn!

    kein unsinn. unter windoze wird einfach ein neuer prozess gestartet. der 'erzeuger' bleibt davon unberührt und kann ganz normal weiterlaufen.
    🙂



  • Mein Unsinn betrifft die Aussage des "dummen" Forkes.

    Es gibt gute Gründe dafür, dass man fork benutzt. Es hat seine Vorteile als auch seine Nachteile. Ich schreib keine Windows System Programme, ich kenne mich nicht mit den Windows Techniken aus. Das von dir erwähnte Verhalten hat ebenfalls Vorteile als auch Nachteile.



  • supertux schrieb:

    Wenn ich es richtig lesen, muss man bei Windows NT folgendes tun:
    1. c:\windows\system32\config.nt erzeugen/editieren
    2. DEVICE=%SystemRoot%\system32\ANSI.SYS eintragen
    3. Restart

    an dem systemeinstellungen herumzupfuschen hat den nachteil, dass es nur auf systemen funktioniert, die auch derart verändert wurden. besser so wie hier: http://www.sourcesnippets.com/c-windows-console-output.html
    🙂



  • supertux schrieb:

    Es gibt gute Gründe dafür, dass man fork benutzt. Es hat seine Vorteile als auch seine Nachteile.

    welche vorteile denn?
    🙂



  • dass du z.b. entscheiden kannst, wann, wie und ob ein neuer Prozess erzeugt wird.



  • supertux schrieb:

    dass du z.b. entscheiden kannst, wann, wie und ob ein neuer Prozess erzeugt wird.

    huh? wann, wie und ob hast du mit CreateProcess auch, allerdings ohne dieses unnötig komplizierte handling eines unixartigen-forks.
    🙂



  • okay, also ich denke ich werde demnächst mit meinem programm fertig sein.

    könnt ihr mir bitte sagen, wie genau ich das dann zu einem programm mach, dass man in windows ausführen kann?

    ich kenn mich abgesehen von programmier-befehlen in linux nämlich null aus und weiss nicht, was und wie man etwas anstellt mit einem kompilierten programm, ausser es mit "./programm" auszuführen :xmas2:



  • hdiloggedout schrieb:

    könnt ihr mir bitte sagen, wie genau ich das dann zu einem programm mach, dass man in windows ausführen kann?

    durch 'nen compiler/linker jagen und dann - starten.
    das ist unter linux nicht anders. als C-entwicklungskit unter windows empfehle ich das: http://www.christian-heffner.de/index.php?page=download&lang=en
    (hat alle wichtigen .h und libraries, um executables unter win zu erstellen).
    🙂



  • winapi-fan schrieb:

    supertux schrieb:

    dass du z.b. entscheiden kannst, wann, wie und ob ein neuer Prozess erzeugt wird.

    huh? wann, wie und ob hast du mit CreateProcess auch, allerdings ohne dieses unnötig komplizierte handling eines unixartigen-forks.
    🙂

    kann es sein, dass wir Birnen mit Äpfeln vergleichen? Ich kenne CreateProcess nicht und was ich davon in der MSDN gefunden habe, deutet für mich darauf hin, immer ein neues Programm im security context (was auch das ist) ausgeführt wird. Was ist, wenn ich nur den aktuellen Prozess duplizieren will?

    @hdi: liest du überhaupt, was man für dich gepostet hat? 😕



  • supertux schrieb:

    deutet für mich darauf hin, immer ein neues Programm im security context (was auch das ist) ausgeführt wird.

    ja, so ist es. der 'security descriptor' ist im prinzip eine struktur, in der alles steht, was ein prozess darf und was nicht. der gestartete prozess 'erbt' im normalfall den SD des aufrufers.

    supertux schrieb:

    Was ist, wenn ich nur den aktuellen Prozess duplizieren will?

    was meinst du mit duplizieren? wenn sich ein programm selbst nochmal startet? das geht so:

    // programm.exe
    int main()
    {
      CreateProcess ("programm.exe", ...);  // gleicher name wie der aufrufer
    }
    

    🙂



  • oh man leute, bitte macht n andres topic auf.

    das hat doch echt nix mehr mit dem hier zu tun 😉

    also jetzt ging das alles zu schnell, viele posts usw ich versteh grad nicht was ich tun kann/soll.

    Also wie muss ich jetzt das "clear" machen, damit es richtig geht unter windows?

    und sonst muss ich also nichts mehr machen?

    einfach den compiler auf dem win-system installieren und ausführen, so wie ich das bei mir auch immer mach?
    sonst nix?



  • Update:

    Okay ich habe das jetzt mal mit diesem PelleC compiler versucht..

    also eine funktion geht schon mal gar nicht, egal die brauch ich nicht unbedingt.

    aber das clearen des screen funzt nicht:

    void clearScreen(void){
    
    #ifdef WIN32
        System("cls");
    #endif
    }
    

    er compiled zwar, ich kann alles starten und es auch benutzen, aber er macht halt einfach nix immer wenn clearScreen() aufgerufen wird.
    Er ignoriert es quasi..

    Und @compiler-freak:

    Wie is'n das mit dem Compilen mit PelleC?
    Ich hatte Win32-Konsolenanwendung gewählt, aber wenn ich das Programm starte kann es keine Umlaute anzeigen? Die MS-DOS-Eingabeaufforderung kann das doch normalerweise schon...?



  • hdi schrieb:

    er compiled zwar, ich kann alles starten und es auch benutzen, aber er macht halt einfach nix immer wenn clearScreen() aufgerufen wird.
    Er ignoriert es quasi..

    der hat wohl das 'WIN32' nicht automatisch definiert für consolen-programme. dazu gehst du auf project->project options->compiler->define preprocessor symbols und setzt da das WIN32 ein. bei den CCFLAGS (ganz unten) steht dann sowas wie: -Tx86-coff -Ot -W1 -Gd -Go -DWIN32. das -DWIN32 zeigt dir, dass WIN32 nun definiert ist und dann sollte es klappen.

    umlaute: in strings sollte man besser keine zeichen ausserhalb des 7-bit ASCII zeichensatzes verwenden, man kann umlaute aber als zahl hineinschreiben. z.b. müsste: puts ("hell\x94, w\x94rld"); hellö, wörld ausgeben.
    🙂



  • CreateProcess-Fan schrieb:

    supertux schrieb:

    deutet für mich darauf hin, immer ein neues Programm im security context (was auch das ist) ausgeführt wird.

    ja, so ist es. der 'security descriptor' ist im prinzip eine struktur, in der alles steht, was ein prozess darf und was nicht. der gestartete prozess 'erbt' im normalfall den SD des aufrufers.

    supertux schrieb:

    Was ist, wenn ich nur den aktuellen Prozess duplizieren will?

    was meinst du mit duplizieren? wenn sich ein programm selbst nochmal startet? das geht so:

    // programm.exe
    int main()
    {
      CreateProcess ("programm.exe", ...);  // gleicher name wie der aufrufer
    }
    

    🙂

    interessant, und der durch CreateProcess erzeugte Prozess startet von Anfang an oder von dort aus, wo CreateProcess aufgerufen wurde? Da sehe ich nämlich eine andere Strategie, weil fork den gesamten Prozess und Zustand im Speicher dupliziert (das einzige, was der Vaterprozess und Kindprozess dann gemeinsam haben, ist der Programmcode).



  • @win32-freak:

    kann ich da nicht lieber im quellcode statt WIN32 etwas definieren, dass standartmässig bei PelleC aktiviert ist?

    Bzw. ich würde dann doch lieber wissen, wie ich eine exe datei bei mir erstellen kann, so dass sie funktioniert auf einem anderen rechner.

    mein programm ist nämlich ein spiel, und das geht an eine frau, und die studiert musik, und ich kann der da nich ankommen mit nem compiler wo sie sich erstma was definieren soll 😉

    ich meine wie machen denn die programmierer alle diese setup-dateien, die man einfach aufruft und die dann das programm installieren und alles geht dann?



  • CreateProcess-Fan schrieb:

    was meinst du mit duplizieren? wenn sich ein programm selbst nochmal startet?

    Ich hatte erst noch einen halben Flame verfasst, hab den aber wieder gelöscht. Bringt bei net/ten/vista/paledog/homo... eh nix.

    Worum es hier doch geht, ist, dass Herangehensweisen unter Unix und Windows historisch bedingt andere sind, und dass dadurch Verfahren, die auf der einen Seite sinnvoll erscheinen, auf der anderen wenig Sinn machen. Supertux sagt hier immer wieder, dass er von den Verfahren unter Windows keine Ahnung hat, eine Zurückhaltung von der sich die Windows-Seite gerne mal 'ne Scheibe abschneiden könnte 😉

    Unter UNIX startet man oft einen Prozess (Master), welcher sich dann selbst mehrmals dupliziert (Worker), ohne ein neues ausführbares Programm in den Speicher zu laden. Unter Windows hat man das meines Wissens nie so gemacht, hier nutzt man dafür seit jeher Threads. Unter Linux übrigens auch immer häufiger.

    win32-freak-freak schrieb:

    ich meine wie machen denn die programmierer alle diese setup-dateien, die man einfach aufruft und die dann das programm installieren und alles geht dann?

    Die kompilieren ihre Programme für alle Plattformen, die sie beliefern möchten, und machen daraus dann Setup-Dateien 😃
    (Je nach Komplexität des Projekts kann das ein Win32-Paket und ein Linux-TGZ mit statisch vorkompilierten Programmen sein, oder auch ein größeres Sammelsurium aus Paketen für unterschiedlichste Distributionen)



  • LordJaxom schrieb:

    Ich hatte erst noch einen halben Flame verfasst, hab den aber wieder gelöscht.

    ach, wie niedlich. warum hast du's nicht als unreg gepostet? das machst du doch sonst immer so, wenn du ausfallend werden willst.
    🙂



  • Leute anscheinend seid ihr ja noch im Thread aktiv.

    Könnt ihr mir also bitte bei dem eigentlichen Problem weiterhelfen?

    Ich weiss noch immer nicht, wie ich ein Programm zu einer exe datei machen kann, die man dann auf einem PC mit Windows ausführen kann 😞


Anmelden zum Antworten