Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取自C中上次引导以来的系统正常运行时间_C_Dos - Fatal编程技术网

获取自C中上次引导以来的系统正常运行时间

获取自C中上次引导以来的系统正常运行时间,c,dos,C,Dos,我需要得到自上次使用C引导以来的系统正常运行时间 目标操作系统是MS DOS 我尝试了time(),ftime(),但它们是相对于1970年1月1日00:00:00的 有人能提出一些解决办法吗 提前感谢。要在MS-DOS上读取系统时间,您可以这样调用(GNU语法): 我发现这在这里可能很有用: 第二个问题是由于BIOS int 0x1A的操作方式。无论何时调用此函数来检索系统时间(当前计时器刻度值),它都会返回当前午夜标志并重置该标志。但由于BIOS功能不会更新DOS日期,因此下次您询问日期时,

我需要得到自上次使用C引导以来的系统正常运行时间

目标操作系统是MS 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;