Windows Hintergrundprozess mit C
Diese Projekt laesst sich mit dem Programm nohup unter Linux vergleichen. Zu diesem Thema gibt es bereits einen Artikel von mir: Windows Hintergrundprozess mit Perl ist im Grunde das gleiche Projekt. Diesmal ist es in C geschrieben, statt in Perl.
Perl-Scripte haben natuerlich auch Nachteile. Es muss ueberhaupt Perl installiert sein, um ein Perl-Script auf einem PC starten zu koennen. Ausserdem muessen auch die benoetigten Perl-Module installiert sein.
Die Nachteile des daemon-Scripts in Perl, sind die Vorteiles dieses Projektes. daemon.exe muss nicht extra installiert werden, damit man es verwenden kann. Die Vorkompilierte daemon.exe ist in diesem Projekt sofort einsatzbereit. Genau so wie das Perl-Script, erzeugt auch daemon.exe einen Prozess mit CreateProcess. Die Option DETACHED_PROCESS spielt in beiden Faellen eine Rolle. Diese Option verhindert auch ein CMD Fenster, beim Programm das im Hintergrund rennen soll. In der beigefuegten notepad-daemon.bat Datei ist auch ein Beispiel fuer die Verwendung. Natuerlich macht es beim Editor nicht viel Sinn. Wie beim Beispiel, unten auf dieser Seite, ersichtlich, kann man dem Hintergrundprogramm auch einen oder mehrere Uebergabeparameter mit uebergeben. Das heisst, es koennen nicht mehrere Programme gleichzeitig gestartet werden, sondern immer nur eines. Das soll aber nicht heissen, dass nicht mehrere Programme gleichzeitig im Hintergrund rennen koennen. Im unteren Beispiel ist file.txt ein Uebergabeparameter fuer das Programm notepad.exe.
Wie fast alle Programme oder Scripte die ich programmiere, muss auch dieses in einem CMD-Fenster gestartet werden. Um das Programm von jedem beliegigen Ort ausfuehren zu koennen, kopiert man sich daemon.exe am besten nach C:WindowsSystem32, falls Rechte dafuer vorhanden sind. Anderfalls kann man auch den Pfad zur daemon.exe Datei in die Umgebungsvariable PATH hinzufuegen. Wer beim der daemon.exe selber keine Textausgabe haben will, kann bei den Linkereinstellungen der Dev-C++ IDE Kein Konsolenfenster erzeugen auf Yes setzten, oder beim Kompilieren die Option -mwindows hinzufuegen.
Beispiele fuer die Verwendung
daemon.exe notepad.exe
daemon notepad.exe file.txt
Info zur Kompilierung
- OS: Windows Vista Home Premium
- IDE: Dev-C++ 4.9.9.2
- Compiler: MinGW (GCC 3.4.2)
- Lizenz: GNU GPL v3
Hallo,
vielen Dank für das nützliche Tool.
Eine Frage habe ich noch: Warum werden Batchdateien nicht ausgeführt?
Beispiel: Hat man die Datei “test.bat” mit dem Inhalt “dir > out”
und ruft “daemon.exe test.bat” auf, so passiert nichts, insbesondere wird die Datei out nicht erzeugt. Gibt es einen Workaround?
Gruß Stefan
Hallo,
das kann ich dir nicht genau sagen. Ich vermute es liegt an den Uebergabeparametern der Funktion CreateProcess(). Vielleicht muss man statt dem ersten Argument nicht NULL reinschreiben, sondern auch den Pfad von dem bat-File.
http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx
Oder es lassen sich generell keine bat-Files im Hintergrund ausfuehren.
Greets,
TheFox