Hallo, ich habe für ein DOS Terminalprogramm (Crosstalk MK.4) ein Script geschrieben, welches Daten in eine Datei abspeichert und mit Zeitstempel versieht. Wenn ich das über Nacht laufen lasse, findet kein Datumswechsel statt! Die Uhr läuft anscheinend weiter. Wenn ich in einem anderen DOS Fenster mit date oder time oder auch in Windows (WinXP) das Datum und die Zeit ändere, wird dies nicht im laufenden DOS Programm übernommen, dort läuft die Uhrzeit ohne Änderung weiter. Den gleichen Effekt habe ich mit einem uralten DOS Programm in C, welches u.a. Datum und Zeit in der Statuszeile anzeigt. Hier der Source Code dazu: struct tm *PoiTime; long ltime; time(<ime); PoiTime = localtime(<ime); ActHour = PoiTime->tm_hour; ActMin = PoiTime->tm_min; ActSec = OldSec = PoiTime->tm_sec; ActDay = PoiTime->tm_mday; ActMon = PoiTime->tm_mon+1; ActYear = PoiTime->tm_year; Stoppe ich die Programme und frage Datum und Zeit in der jeweiligen DOS Box ab, stimmt wieder alles. Frage: Wird für ein einmal gestartetes DOS Programm in einer DOS Box (cmd.exe) eine eigene Uhr ohne Datumsweiterschaltung simuliert???
Zunächst einmal: cmd.exe ist kein "DOS-Fenster", was dort läuft und auf Deine Eingaben "date" und "time" reagiert, ist auch kein DOS, sondern eine 32-Bit-Konsolen-Applikation, die rein zufälligerweise auch ein paar DOS-Kommandos versteht (und die meisten mit zusätzlichen Fähigkeiten auch noch ganz massiv aufgebohrt hat). Wenn Du in einem solchen Fenster ein DOS-Programm startest (ein DOS-Programm ist ein 16-Bit-Programm), dann wird ein Prozess namens NTVDM gestartet, der eine virtuelle DOS-Umgebung zur Verfügung stellt. Dein DOS-Programm bekommt von dieser Umgebung eine standardisierte PC-Hardware vorgegaukelt. Wenn Du aber Dein DOS-Programm beendest, beendet sich auch NTVDM, und Deine vermeintlichen DOS-Befehle "date" und "time" werden wieder von cmd.exe ausgewertet -- das lässt also keinerlei Rückschluss auf das Zeitverhalten innerhalb von NTVDM zu. Um das zu testen, musst Du in cmd.exe command.com aufrufen und dann erst Dein DOS-Programm bzw. Deine Testkommandos. Wenn Du Dir eine Verknüpfung auf command.com erstellst, kannst Du Dir mal die Eigenschaften der Verknüpfung ansehen, dort wird unter "Programm" ein Knopf "Erweitert" angeboten, mit dem unter anderem eine "kompatible Timerhardwareemulation" aktiviert werden kann. Desweiteren gibt es unter "Sonstiges" eine Checkbox "Immer aussetzen", die Du vermutlich deaktivieren solltest.
Vielen Dank erst einmal für die ausführliche Antwort! Ich habe jetzt alle 4 Kombinationen ("kompatible Timerhardwareemulation" und "Immer aussetzen") in der Verknüpfung auf command.com getestet. Es bleibt dabei: Uhrzeit wird richtig emuliert, Datum bleibt stehen. Also gehe ich erst mal davon aus, dass NTVDM das Datum um 00.00 Uhr nicht weitersetzt. (In meinem Script schalte ich das Datum nun eben selbst weiter.)
Es gibt im PC-Bios (oder in DOS, bin mir nicht mehr sicher) eine Art Bug, und zwar wird das Datum nicht automatisch weitergeschaltet. Beim Abfragen der Zeit gibt es ein Bit "Midnight rollover", das ausgewertet werden muss, um das Datum zu inkrementieren. Das Bit wird nach dem Lesen der Zeit automatisch gelöscht. Der Befehl TIME führt diese Korrektur wohl aus. Wird die Zeit anders ausgelesen als mit den BIOS- resp. DOS-INT, so bleibt die Korrektur wohl aus. Vielleicht hat MS dieses Verhalten auch in NTVDM eingebaut, da ja alles kompatibel bleiben muss.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.