在minix2.0源代码中,有相当经典的时间转换函数实现(src\ src\ lib\ ansi\ asctime.c),今天我们就来分析一下asctime.c中的源码
首先引入几个相关的头文件:
1、time.h 主要的结构体与相关定义:
struct tm { int tm_sec; /* 分钟后面的秒[0, 59] */ int tm_min; /* 小时后面的分钟[0, 59] */ int tm_hour; /* 距离凌晨00:00点的小时数[0, 23] */ int tm_mday; /* 月中的某一天[1, 31] */ int tm_mon; /* 某一个月份[0, 11] */ int tm_year; /* 与1900相隔的年数 */ int tm_wday; /* 离星期日的天数 [0, 6] */ int tm_yday; /* 从一月开始的天数 [0, 365] */ int tm_isdst; /* Daylight Saving Time flag */ }; char *asctime(const struct tm *_timeptr)
2、loc_time.h
#define YEAR0 1900 /*第一年*/ #define EPOCH_YR 1970 /* EPOCH = Jan 1 1970 00:00:00 */ #define SECS_DAY (24L * 60L * 60L) #define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400))) #define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365) #define FIRSTSUNDAY(timp) (((timp)->tm_yday - (timp)->tm_wday + 420) % 7) #define FIRSTDAYOF(timp) (((timp)->tm_wday - (timp)->tm_yday + 420) % 7) #define TIME_MAX ULONG_MAX #define ABB_LEN 3 extern const int _ytab[2][12]; extern const char *_days[]; extern const char *_months[]; void _tzset(void); unsigned _dstget(struct tm *timep); extern long _timezone; extern long _dst_off; extern int _daylight; extern char *_tzname[2];
3、asctime.c
#include <string.h> #include <time.h> #include "loc_time.h" #define DATE_STR "??? ??? ?? ??:??:?? ????\n" //时间格式 static char * two_digits(register char *pb, int i, int nospace) { //将两位数字转化为字符形式并存储在pb所指向的地址空间中 *pb = (i / 10) % 10 + '0'; if (!nospace && *pb == '0') *pb = ' '; pb++; *pb++ = (i % 10) + '0'; return ++pb; } static char * four_digits(register char *pb, int i) { //将四位数字转化为字符形式并存储在pb所指向的地址空间中 i %= 10000; *pb++ = (i / 1000) + '0'; i %= 1000; *pb++ = (i / 100) + '0'; i %= 100; *pb++ = (i / 10) + '0'; *pb++ = (i % 10) + '0'; return ++pb; } char *asctime(const struct tm *timeptr) //把timeptr指向的tm结构体中储存的时间转换为字符串格式返回。 { // 格式为:Www Mmm dd hh:mm:ss yyyy。 //其中Www为星期;Mmm为月份;dd为日;hh为时;mm为分;ss为秒;yyyy为年份。 static char buf[26]; register char *pb = buf; register const char *ps; register int n; strcpy(pb, DATE_STR); //对buf进行标准格式初始化: pb-> ??? ??? ?? ??:??:?? ????\n ps = _days[timeptr->tm_wday]; //extern const char *_days[]; n = ABB_LEN; //#define ABB_LEN 3 while(--n >= 0) *pb++ = *ps++; pb++; ps = _months[timeptr->tm_mon]; n = ABB_LEN; while(--n >= 0) *pb++ = *ps++; pb++; pb = two_digits( two_digits( two_digits(two_digits(pb, timeptr->tm_mday, 0) , timeptr->tm_hour, 1) , timeptr->tm_min, 1) , timeptr->tm_sec, 1); four_digits(pb, timeptr->tm_year + 1900); return buf; }
相关推荐
Minix2.0.4-Intel-2.0.4.tar源代码
Minix2.0.4-Minix2.0.4-Intel-2.0.4.tar源代码第二部分
标题中的 "minix203.rar" 是一个压缩文件,包含了 Minix 2.03 的相关组件。"Minix203.img" 是 Minix 2.03 的内核镜像文件,它是一个磁盘映像,可以被模拟器或者虚拟机如 BOCHS 使用来启动并运行 Minix 操作系统。...
minix操作系统的复习题.pdf
这本书《操作系统设计与实现》详细介绍了Minix系统的构建原理和实现细节,对于想要深入理解操作系统工作原理的人来说是一份宝贵的资源。 首先,Minix系统基于微内核架构,这意味着核心操作系统功能被最小化并集中在...
在 Minix 的源代码中,`a.out` 文件格式的实现尤为关键,因为它是操作系统中用于表示可执行文件的一种重要格式。 #### `a.out` 文件格式 `a.out` 文件格式是一种早期的可执行文件格式,在许多 Unix 及类 Unix 系统...
根据提供的文件信息,可以...通过以上知识点,我们可以了解在Minix操作系统中添加一个支持实时进程的系统调用并实现彩票调度算法的过程。这涉及到对操作系统内核源码的深入理解,以及对进程调度策略的细致设计和实现。
Minix 3.1.0 采用微内核架构,许多传统操作系统中的服务在 Minix 中被实现为独立的服务器进程,如文件系统服务器、网络服务器和时钟服务器等。这些服务器运行在用户空间,通过消息传递与内核通信,提供服务。这个...
在minix操作系统中实现shell的程序代码,实现语言C
### 在Vmware中安装MINIX 3的知识点 #### 一、基础知识介绍 - **MINIX 3**:是一款免费的类Unix操作系统,主要用于教学和研究目的。它以微内核架构著称,并且因其简单性和可靠性而广受好评。MINIX 3的设计目的是...
在Minix中实现信号量对于理解和优化多进程协作至关重要。 信号量是一种计数器,可以用于保护共享资源。在Minix中,信号量分为两种类型:二进制信号量和计数信号量。二进制信号量只有两个状态,0表示资源不可用,1...
通过分析这部分代码,我们可以理解如何在微内核中实现多任务并发执行,以及如何协调不同进程间的资源分配和协作。 2. **内存管理**:MINIX 2.0的内存管理系统包括了虚拟内存、页表管理等,这对于理解和优化操作系统...
Minix_R3.2.1-972156d.rar 是一个包含Minix 3.2.1操作系统ISO启动光盘镜像的压缩文件。Minix是一款开源、类Unix的操作系统,由荷兰计算机科学家Andrew S. Tanenbaum教授设计,主要用于教学和研究目的。这个版本的...
在Minix Shell中,C语言是主要的编程工具,用于编写shell的源代码。 **Minix Shell的关键特性** 1. **命令解析**:Shell首先要能够解析用户的输入,将命令、参数和路径分隔开来。这通常通过词法分析和语法分析完成...
\操作系统教程_Minix_设计与实现\操作系统教程_Minix_设计与实现\操作系统教程_Minix_设计与实现\操作系统教程_Minix_设计与实现
4. **inode(索引节点)**:MINIX文件系统中的每个文件和目录都由一个inode表示,包含了文件的元数据,如所有权、权限、创建时间、修改时间等。inode不存储文件内容,而是指向存储数据的磁盘块。 5. **目录项...
MINIX 3系统安装光盘镜像(操作系统设计与实现第三版下册的附带光盘)
MINIX 2.0.3的源码中,你可以找到系统调用的实现细节,了解如何在用户空间和内核空间之间传递信息。 通过分析MINIX 2.0.3的源码,不仅可以加深对操作系统原理的理解,还能学习到微内核架构的实际应用。这对于操作...