获取自C中上次引导以来的系统正常运行时间
我需要得到自上次使用C引导以来的系统正常运行时间 目标操作系统是MS DOS 我尝试了获取自C中上次引导以来的系统正常运行时间,c,dos,C,Dos,我需要得到自上次使用C引导以来的系统正常运行时间 目标操作系统是MS DOS 我尝试了time(),ftime(),但它们是相对于1970年1月1日00:00:00的 有人能提出一些解决办法吗 提前感谢。要在MS-DOS上读取系统时间,您可以这样调用(GNU语法): 我发现这在这里可能很有用: 第二个问题是由于BIOS int 0x1A的操作方式。无论何时调用此函数来检索系统时间(当前计时器刻度值),它都会返回当前午夜标志并重置该标志。但由于BIOS功能不会更新DOS日期,因此下次您询问日期时,
time()
,ftime()
,但它们是相对于1970年1月1日00:00:00的
有人能提出一些解决办法吗
提前感谢。要在MS-DOS上读取系统时间,您可以这样调用(GNU语法):
我发现这在这里可能很有用:
第二个问题是由于BIOS int 0x1A的操作方式。无论何时调用此函数来检索系统时间(当前计时器刻度值),它都会返回当前午夜标志并重置该标志。但由于BIOS功能不会更新DOS日期,因此下次您询问日期时,它将不会正确更新。DOS知道这种行为,因此当您调用任何DOS函数时,午夜标志都会正确维护。如果您自己调用BIOS int 0x1A,则必须检查午夜标志值,并在设置后将其重新打开
因此,简而言之,如果您需要MS-DOS在程序运行时保持正确的日期,您必须做额外的工作(例如手动恢复标志并在每次找到标志时调用它)可能没有标准的c函数,但是看看这里是怎么做的:MS DOS系统定时器中断在18.2065 Hz时被调用,并在
0040:006C
处递增32位计数器,这是自通电以来的滴答数。当计数达到24小时时,它会被清除,并且0040:0070
处的字节值会增加。您可以研究int 1Ah
函数00h
获取时钟计数器,我认为它的副作用是清除午夜标志。您可以在启动时获取时间,然后在需要正常运行时间时,您可以再次读取时间,然后可以使用函数difftime()
获取正常运行时间值。如果您的目标平台是*nix
请从procps
查看uptime.c
,如果正常运行时间超过24小时怎么办?例如,666天?@AndrejsCainikovs刚刚编辑,但没有示例代码,因为有不同的方式安排常规呼叫。我们这里讨论的是非保护模式DOS,幸运的是一夜之间就完成了。而且,除非您有双8英寸软盘,否则在交换数据和系统磁盘以完成代码时,磁盘读取错误总是有崩溃的风险。。。8088和8086机器都是很好的机器,配备了开箱即用的运动鞋网……为了完整性起见,第二个例子如果调用次数足够多,应该要花上好几天的时间:)(但代码未经测试)虽然这很粗糙,但我同意这可能是起床时间最不痛苦的方式(更准确地说,计算),因为MS-DOS不提供此功能。另一种方法是从外围设备获取启动时间。例如,所有现代硬盘都支持ATAPI,您可以使用该协议从硬盘读取统计数据(开机时间)。但这是痛苦的屁股。
unsigned short cx, dx;
__asm__ (
"mov $0, %%ah \n\t"
"int $0x1a \n\t"
: "=c" (cx), "=d" (dx)
:
: "ax"
);
time_t time = cx;
time <<= 16;
time |= dx;
time = (time_t) ((double)time / 18.2065);
unsigned short ax, cx, dx;
static unsigned days = 0;
__asm__ (
"mov $0, %%ah \n\t"
"int $0x1a \n\t"
: "=a" (ax), "=c" (cx), "=d" (dx)
);
if (ax & 0xff) ++days;
time_t time = cx;
time <<= 16;
time |= dx;
time = (time_t) ((double)time / 18.2065);
time += days * 86400;