第6章 Linux编程—内存分配与时间函数

合集下载

linux,内核的物理内存分配的基本方式

linux,内核的物理内存分配的基本方式

Linux内核的物理内存分配基本方式在Linux内核中,物理内存分配的基本方式可以通过以下几个方面进行解释。

1. 内核启动阶段的物理内存分配在Linux内核启动阶段,内核需要为自身和各个子系统分配物理内存。

这个过程包括以下几个步骤:•内核从BIOS或者bootloader中获取系统的物理内存信息。

•内核根据系统的内存布局,将物理内存分成多个区域,如低端内存、高端内存等。

•内核为自身分配一部分物理内存,包括内核代码、数据、堆栈等。

•内核为各个子系统分配物理内存,如设备驱动、文件系统等。

2. 动态分配物理内存在运行时,Linux内核还需要动态分配物理内存来满足进程和内核的需求。

这个过程包括以下几个关键点:页框分配:内核使用页框作为最小的内存分配单位。

当一个进程或内核需要分配物理内存时,内核会使用页框分配算法来选择可用的物理页框。

页框可以通过使用位图或者链表等数据结构来管理。

伙伴系统:为了高效地管理和分配物理内存,Linux内核采用了伙伴系统。

伙伴系统将整个物理内存空间分成不同大小的块(通常是2的幂次方),每个块称为一个伙伴块。

当一个进程需要分配内存时,内核会在合适的伙伴块中找到一个合适大小的块来满足需求。

页面回收:当物理内存不足时,Linux内核会使用页面回收机制来回收部分物理内存。

页面回收可以通过将不再使用的内存页面写回硬盘,或者将内存页面移动到交换分区来实现。

回收后的物理内存可以重新分配给其他进程或内核使用。

3. 内存管理算法为了高效地管理物理内存,Linux内核采用了一些内存管理算法。

其中一些重要的算法包括:最先适应算法(First Fit):内核首先查找第一个满足分配要求的伙伴块。

这个算法简单直观,但可能导致伙伴块的碎片化。

最佳适应算法(Best Fit):内核在所有可用的伙伴块中选择最小的一个来满足分配需求。

这个算法可以减少碎片化,但需要更多的搜索开销。

循环首次适应算法(Next Fit):内核在上一次分配的位置开始搜索,直到找到第一个满足分配要求的伙伴块。

linux中内核的物理内存分配基本方式

linux中内核的物理内存分配基本方式

linux中内核的物理内存分配基本方式Linux操作系统是一种开源的、基于Unix的操作系统,广泛应用于服务器和嵌入式设备上。

它的内核是Linux操作系统的核心部分,负责管理硬件资源和提供对各种操作系统功能的支持。

物理内存(Physical Memory)是计算机系统中的一个重要组成部分,它用于存储操作系统和应用程序的数据和指令。

Linux内核实现了多种物理内存分配方式,本文将逐步介绍这些基本方式。

物理内存的分配是指将系统中可用的物理内存划分并分配给不同的进程和任务使用。

Linux内核中的物理内存分配涉及到多个层次和组件,包括内存管理子系统、虚拟内存管理子系统以及具体的分配函数和算法。

在Linux内核中,物理内存的分配基本方式包括连续内存分配和分页内存分配。

下面我们将分别介绍这两种方式。

一、连续内存分配连续内存分配是指将物理内存划分为连续的块,并按照请求的大小分配给进程。

在Linux内核中,连续内存分配通常发生在系统启动过程中的初始化阶段。

内核会首先获取全部可用的物理内存范围,然后按照一定规则进行划分,如将物理内存空间划分为若干个大小相等的页框。

内核根据特定的算法和策略来管理和分配这些连续内存块。

例如,内核可以使用“buddy system”算法来管理连续内存空间。

该算法将连续内存空间划分为不同大小的块,并维护一个二叉树结构来描述这些块的空闲状态。

当进程需要分配内存时,内核会按照一定规则从二叉树中选择一个合适大小的块,并将其标记为已分配。

二、分页内存分配分页内存分配是指将物理内存划分为一系列固定大小的页框,并按页的单位进行内存分配。

在Linux内核中,页的大小通常为4KB或者更大。

分页内存分配是Linux内核中的主要内存管理方式之一。

Linux内核使用页表机制来实现虚拟内存到物理内存的映射,以及页的分配和管理。

页表是一种数据结构,它记录了虚拟内存和物理内存之间的映射关系。

内核通过页表来查找虚拟内存页对应的物理内存页,并进行内存访问和管理。

实现内存分配实验报告(3篇)

实现内存分配实验报告(3篇)

第1篇一、实验目的1. 理解操作系统内存分配的基本原理和常用算法。

2. 掌握动态分区分配方式中的数据结构和分配算法。

3. 通过编写程序,实现内存分配和回收功能。

二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 开发工具:GCC编译器三、实验原理1. 内存分配的基本原理操作系统内存分配是指操作系统根据程序运行需要,将物理内存分配给程序使用的过程。

内存分配算法主要包括以下几种:(1)首次适应算法(First Fit):从内存空间首部开始查找,找到第一个满足条件的空闲区域进行分配。

(2)最佳适应算法(Best Fit):在所有满足条件的空闲区域中,选择最小的空闲区域进行分配。

(3)最坏适应算法(Worst Fit):在所有满足条件的空闲区域中,选择最大的空闲区域进行分配。

2. 动态分区分配方式动态分区分配方式是指操作系统在程序运行过程中,根据需要动态地分配和回收内存空间。

动态分区分配方式包括以下几种:(1)固定分区分配:将内存划分为若干个固定大小的分区,程序运行时按需分配分区。

(2)可变分区分配:根据程序大小动态分配分区,分区大小可变。

(3)分页分配:将内存划分为若干个固定大小的页,程序运行时按需分配页。

四、实验内容1. 实现首次适应算法(1)创建空闲分区链表,记录空闲分区信息,包括分区起始地址、分区大小等。

(2)编写分配函数,实现首次适应算法,根据程序大小查找空闲分区,分配内存。

(3)编写回收函数,回收程序所占用的内存空间,更新空闲分区链表。

2. 实现最佳适应算法(1)创建空闲分区链表,记录空闲分区信息。

(2)编写分配函数,实现最佳适应算法,根据程序大小查找最佳空闲分区,分配内存。

(3)编写回收函数,回收程序所占用的内存空间,更新空闲分区链表。

3. 实验结果分析(1)通过实验,验证首次适应算法和最佳适应算法的正确性。

(2)对比两种算法在内存分配效率、外部碎片等方面的差异。

五、实验步骤1. 创建一个动态内存分配模拟程序,包括空闲分区链表、分配函数和回收函数。

linux几种时间函数总结

linux几种时间函数总结

linux⼏种时间函数总结⼀、linux时间函数总结 最近的⼯作中⽤到的时间函数⽐较频繁,今天抽时间总结⼀下,在linux下,常⽤的获取时间的函数有如下⼏个: asctime, ctime, gmtime, localtime, gettimeofday , mktime, asctime_r, ctime_r, gmtime_r, localtime_r⼆、常⽤的结构体(1)struct tm ;1struct tm {2int tm_sec; /* seconds */3int tm_min; /* minutes */4int tm_hour; /* hours */5int tm_mday; /* day of the month */6int tm_mon; /* month */7int tm_year; /* year */8int tm_wday; /* day of the week */9int tm_yday; /* day in the year */10int tm_isdst; /* daylight saving time */11 };1213//int tm_sec 代表⽬前秒数,正常范围为0-59,但允许⾄61秒14//int tm_min 代表⽬前分数,范围0-5915//int tm_hour 从午夜算起的时数,范围为0-2316//int tm_mday ⽬前⽉份的⽇数,范围01-3117//int tm_mon 代表⽬前⽉份,从⼀⽉算起,范围从0-1118//int tm_year 从1900 年算起⾄今的年数19//int tm_wday ⼀星期的⽇数,从星期⼀算起,范围为0-620//int tm_yday 从今年1⽉1⽇算起⾄今的天数,范围为0-36521//int tm_isdst ⽇光节约时间的旗标(2)struct timeval,struct timezone;1struct timeval {2 time_t tv_sec; /* seconds (秒)*/3 suseconds_t tv_usec; /* microseconds(微秒) */4 };5struct timezone {6int tz_minuteswest; /* minutes west of Greenwich */7int tz_dsttime; /* type of DST correction */8 };9int tz_minuteswest; /* 格林威治时间往西⽅的时差 */10int tz_dsttime; /* 时间的修正⽅式*/三、时间函数介绍:(1)time() 函数获取当前时间1 SYNOPSIS2 #include <time.h>34 time_t time(time_t *t);56 DESCRIPTION7 time() returns the time as the number of seconds since the Epoch, 1970-01-0100:00:00 +0000 (UTC).8//此函数会返回从公元1970年1⽉1⽇的UTC时间从0时0分0秒算起到现在所经过的秒数。

电子科技大学 UNIX_Linux操作系统内核结构6章

电子科技大学 UNIX_Linux操作系统内核结构6章

一个进程的上下文包括五个方面: ①、被进程正文所定义的进程状态 ②、进程所使用的全局变量和数据结构的值 ③、机器寄存器的值 ④、进程表项proc结构和user结构中的值 ⑤、用户堆栈和核心堆栈中的值
“执行一个进程”——指系统在该进程的上下文中执行, 也就是进程的上下文确定和限制了进程的运行环境和空间。
可以随进程状态的变化而在内外存之间交换的进程控制信 息中的其余部分。
为了方便进程映像在内外之间交换,UNIX系统中把进程非 常驻内存部分作为一个整体,占用连续的存贮区,其顺序是: 首先是user结构(进程扩充控制块)和核心栈,然后是数据段 和用户栈。
16
进程user结构和核心栈合并构成进程的“本进程数据区— —ppda区(per process data area)。
15
在进程映像占用的内存被分配给其他进程之前,不但该进 程的程序和数据需要调出内存,该进程的控制信息也被调出内 存。但为了该进程能够再次被调入内存,内存中需要保留一部 分必要的信息,这就把进程控制信息也分成了常驻内存和非常 驻内存两部分: 常驻内存控制信息块
是系统需要经常查询以及恢复整个进程映象时所不可缺少 的信息。 非常驻内存控制信息块
7
3、进程的解释
在UNIX系统中进程的概念包含什么意义?
在较高级的方面 进程是一个重要的组织概念。可以把计算机系统看作是若
干进程组合的活动。进程是系统中活动的实体,它可以生成和 消灭,申请和释放资源,可以相互合作和竞争,而真正活动的 部件如处理机和外部设备则是看不见的。
在较低级方面 进程是不活动的实体,而处理机则是活动的,处理机的任
核心从一个进程转到另一个进程执行时,叫做“上下文切
换”,也就是系统从一个进程上下文确定的环境换到另一个进

LINUX系统基本的内存管理知识讲解

LINUX系统基本的内存管理知识讲解

LINUX系统基本的内存管理知识讲解在 LINUX 操作系统中,内存管理是任何管理员必须了解的重要主题之一。

内存管理不仅包括内存的分配和释放,还包括缓存和页面缓存等概念。

以下是 LINUX系统基本的内存管理知识的讲解。

内存分配和释放在 LINUX 中,内存分配和释放是非常重要的操作。

内存分配过程涉及到申请一块连续的内存,而内存释放操作则将已申请的内存归还给系统。

这些操作都会在系统启动时完成,并由内核来管理。

内核负责将申请的内存分配给进程,以及在进程退出或不再需要该内存时回收内存。

内存分配是通过系统调用完成的。

常见的系统调用包括malloc()和free()。

malloc()函数用于申请一定量的内存,而free()函数用于释放该内存。

在 LINUX 中,内存还可以通过open()和mmap()等系统调用进行分配。

open()函数用于打开一个文件,而mmap()函数将该文件映射到内存中。

缓存LINUX 使用缓存机制来提高文件的读取速度。

缓存是将文件的一部分存储在内存中,以便之后更快地访问该文件。

此过程由内核负责完成,并使用缓存替换算法以确保缓存中的数据始终是最有用的数据。

LINUX 中的缓存是通过读取文件系统中的文件并在其中进行缓存的。

当内核需要根据文件系统中的文件读写某个文件时,它会自动查找文件是否已经在缓存中。

如果文件没有在缓存中,则会从磁盘中读取并将其存储在缓存中。

当请求某个文件时,文件将从缓存中读取,而不是从磁盘中读取,这可以大大提高读取速度。

页面缓存在 LINUX 中,页面缓存是一种特殊类型的缓存,用于在内存中存储磁盘数据块的副本。

当文件从磁盘读取时,Linux 将其读取到页面缓存中,并将副本存储在内存中。

每当应用程序请求读取文件时,Linux 将数据块从页面缓存中读取并传递给应用程序。

如果应用程序更改了数据块,则本地副本和磁盘上的数据块将异步更新。

内存管理工具LINUX 中有几个内存管理工具,可以帮助管理员了解内存使用情况。

linux核心函数

linux核心函数Linux 内核是操作系统的核心部分,它提供了操作系统的核心功能,包括进程管理、内存管理、文件系统等。

Linux 内核的源代码中包含了大量的函数,用于实现各种操作系统的功能。

以下是一些Linux 内核中常见的核心函数,它们扮演着关键的角色:1.进程管理函数:–fork():创建一个新的进程。

–exec():在当前进程中执行一个新的程序。

–wait():等待子进程结束。

–exit():终止当前进程。

2.调度和任务管理函数:–schedule():进行进程调度。

–yield():主动让出CPU,将当前进程移动到就绪队列的末尾。

–wake_up_process():唤醒一个等待中的进程。

3.内存管理函数:–kmalloc():在内核中分配内存。

–kfree():释放内核中的内存。

–vmalloc():在虚拟地址空间中分配内存。

4.文件系统函数:–open():打开一个文件。

–read():从文件中读取数据。

–write():向文件中写入数据。

–close():关闭文件。

5.设备驱动函数:–register_chrdev():注册字符设备。

–unregister_chrdev():注销字符设备。

–request_irq():注册中断处理函数。

6.网络函数:–socket():创建套接字。

–bind():将套接字与地址绑定。

–listen():侦听传入连接请求。

–accept():接受传入的连接请求。

7.定时器和时钟函数:–timer_create():创建一个定时器。

–timer_settime():设置定时器的时间。

–gettimeofday():获取当前时间。

8.同步和互斥函数:–spin_lock():获取自旋锁。

–spin_unlock():释放自旋锁。

–mutex_lock():获取互斥锁。

–mutex_unlock():释放互斥锁。

这些函数仅仅是Linux 内核中众多函数的一小部分,Linux 内核的源代码非常庞大而复杂,包含了各种各样的功能和模块。

Linux操作系统应用编程课件(完整版)


2.Linux操作系统的发行版
Linux操作系统发行版实际就是Linux内核加上外围实用程序 组成的一个大软件包。相对于Linux操作系统的内核版本,发行版 的版本号随发布者的不同而不同,与Linux操作系统内核的版本号 是相对独立的。因此把SUSE、RedHat、Ubuntu、Slackware等直 接称为Linux是不确切的,它们是Linux操作系统的发行版。更确 切地说,应该将它们称为“以Linux为核心的操作系统软件包”。
Shell是Linux操作系统的一种用户界面,它作为操作系统 的“外壳”,为用户提供使用操作系统的接口。Shell主要有以 下两大功能特点。
(1)Shell是一个命令解释器,它拥有自己内建的Shell命令集。 (2)Shell的另一个重要特性是它自身就是一种解释型的程序设 计语言。
当用户成功登录Linux系统后,系统将执行一个Shell程序。 正是Shell进程提供了命令提示符。作为默认值,Shell对普通用 户用“$”作提示符,对超级用户(root)用“#”作提示符。
1.4.4 联机手册
联机手册命令man可向用户提供系统中各种命令、系统调用、 库函数和重要系统文件的详细说明,包括名字、使用语法、功能 描述、应用实例和相关参考文件等。其格式如下:
$ man [拥有哪个级别的帮助。 -k:查看和命令相关的所有帮助。
查看who命令的详细说明示例如下。 $ man who
Linux操作系统 应用编程
本章主要介绍Linux文件系统,包括文件系统的结构、文 件的定义与分类、目录与文件操作命令、文件的权限管理等, 让读者对Linux文件系统有一定的认识和理解,为后文的学习 打下基础。
2.1.1 组织结构
Linux操作系统中所有文件存储在文件系统中,文件被组织 到一棵“目录树”中,其文件系统层次结构(树状目录结构)如 图2.1所示。树根在该层次结构的顶部,树根的下方衍生出子目 录分支。

分配内存函数

分配内存函数
分配内存函数是指在程序中动态地分配内存空间的函数。

在C语
言中,常用的分配内存函数有malloc、calloc、realloc等。

1. malloc函数:malloc函数的原型为void *malloc(size_t size),功能是分配size字节的内存空间,并返回该空间的起始地址。

这个函数不会对申请到的空间进行初始化。

2. calloc函数:calloc函数的原型为void *calloc(size_t nmemb, size_t size),功能是分配nmemb个元素,每个元素大小为
size字节的内存空间,并返回该空间的起始地址。

这个函数会将申请
到的空间全部初始化为0。

3. realloc函数:realloc函数的原型为void *realloc(void
*ptr, size_t size),功能是重新分配ptr指向的内存空间的大小为size字节,并返回新的空间起始地址。

如果ptr指向的空间大小不够,会开辟新的空间并将数据复制到新的空间中,如果大小足够则直接返
回原空间的地址,如果size为0则释放空间并返回NULL。

这些函数在申请内存空间时都可能导致内存分配失败,因此需要
用if判断申请空间是否成功。

例如:
```
int *p = (int*)malloc(sizeof(int)*n);
if(p == NULL){
printf("分配内存失败");
exit(1);
}
```。

linux的malloc函数

linux的malloc函数malloc是C 语言中的一个标准库函数,它用于在堆上动态分配内存。

在Linux 系统中,当你使用malloc时,你实际上是调用了 C 标准库中的这个函数。

这个函数是跨平台的,不仅限于Linux。

malloc的原型如下:cvoid *malloc(size_t size);其中,size参数指定要分配的字节数。

如果分配成功,malloc返回一个指向被分配内存的指针。

如果分配失败(例如,由于内存不足),则返回NULL。

使用malloc分配的内存块是未初始化的,即它们不包含任何特定的值。

如果你需要分配的内存块被初始化为0,可以使用calloc函数。

在使用完通过malloc分配的内存后,你应该使用free函数来释放它,以避免内存泄漏。

示例:c#include<stdio.h>#include<stdlib.h>int main() {int *ptr;size_t num = 10; // 分配10个整数的空间ptr = (int*)malloc(num * sizeof(int)); // 分配内存if (ptr == NULL) {printf("Memory allocation failed!\n");return1; // 返回错误代码}// 使用分配的内存...for (size_t i = 0; i < num; i++) {ptr[i] = i * i;}// 打印结果for (size_t i = 0; i < num; i++) {printf("%zu: %d\n", i, ptr[i]);}// 释放内存free(ptr);return0;}注意:在上面的示例中,我使用了类型转换(int*)来将malloc返回的void*指针转换为int*指针。

但在 C 语言中,当将void*赋值给其他类型的指针时,这种类型转换是自动的(在C++ 中则必须明确进行类型转换)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

munmap(解除内存映射)
Asctime 将时间和日期以字符串格式表示
示例解析
• • • • • • • #include <time.h> main() { time_t timep; time (&timep); printf("%s",asctime(gmtime(&timep))); }
• • • •

• 在调用mmap()时必须要指定MAP_SHARED 或 MAP_PRIVATE。参数fd为open()返回的文件描 述词,代表欲映射到内存的文件。参数offset 为 文件映射的偏移量,通常设置为0,代表从文件最 前方开始对应,offset必须是分页大小的整数倍。 • 返回值 • 若映射成功则返回映射区的内存起始地址,否则 返回MAP_FAILED(-1),错误原因存于errno 中。
gettimeofday(取得目前的时间)
• 表头文件 #include <sys/time.h> #include <unistd.h> • • 定义函数 int gettimeofday ( struct timeval * tv , struct timezone * tz ) 函数说明 gettimeofday () 会把目前的时间有tv 所指的结构返回,当地时区的信 息则放到tz 所指的结构中。timeval结构定义为: struct timeval{ long tv_sec; /*秒*/ long tv_usec; /*微秒*/ };
settimeofday(设置目前时间)
time(取得目前的时间)
示例解析
• #include<time.h> • main() • { • int seconds= time((time_t*)NULL); • printf(“%d\n”,seconds); • }
gmtime(取得目前时间和日期)
• 表头文件 #include<time.h> • 定义函数 struct tm*gmtime(const time_t*timep); • 函数说明
• • • • • • • • • • • • • • gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世界 所使用的时间日期表示方法,然后将结果由结构tm返回。结构tm的定 义为: struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; };

• timezone 结构定义为: struct timezone{ int tz_minuteswest; /*和Greenwich时间差了多少分钟*/ int tz_dsttime; /*日光节约时间的状态*/ }; 上述两个结构都定义在 /usr/include/sys/time.h。tz_dsttime 所代表的 状态如下: DST_NONE /*不使用*/ DST_USA /*美国*/ DST_AUST /*澳洲*/ DST_WET /*西欧*/ DST_MET /*中欧*/ DST_EET /*东欧*/ DST_CAN /*加拿大*/ DST_GB /*大不列颠*/ DST_RUM /*罗马尼亚*/ DST_TUR /*土耳其*/ DST_AUSTALT /*澳洲(1986 年以后)*/
free(释放原先配置的内存)
getpagesize(取得内存分页大小)
示例解析
• • • • • #include <unistd.h> main() { printf("page size = %d\n",getpagesize( ) ); }
malloc(配置内存空间)
示例解析
• #include <unistd.h> • main() • { • char *p =(char*)( malloc(1024)); /*配置 1k的内存*/ • }

• 错误代码
• EBADF 参数fd不是有效的文件描述词 • EACCES 存取权限有误。如果是MAP_PRIVATE 情况下 文件必须可读,使用MAP_SHARED 则要有 PROT_WRITE 以及该文件要能写入。 • EINVAL 参数 start、length或offset有一个不合法。 • EAGAIN 文件被锁住,或是有太多内存被锁住。 • ENOMEM 内存不足。
mmap(建立内存映射)

• 参数flags 会影响映射区域的各种特性:
• • • MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映 射,不对地址做修正。通常不鼓励用此旗标。 MAP_SHARED 对映射区域的写入数据会复制回文件内,而且允许其他 映射该文件的进程共享。 MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即 私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回 原来的文 件内容。 MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而 且映射区域无法和其他进程共享。 MAP_DENYWRITE 只允许对映射区域的写入操作,其他对文件直接写入 的操作将会被拒绝。 MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。
Linux操作系统
• 大工软件学院嵌入式系 邱铁
办公楼409 Tel:87571521 E_mail: qiutie@
第6章 Linux编程 —内存分配与时间函数
Calloc(配置内 • • • • • • • /* 动态配置10 个struct test 空间 */ #include<stdlib.h> struct test { int a[10]; char b[20]; } main() { struct test *ptr=calloc(sizeof(struct test),10); }

• int tm_sec 代表目前秒数,正常范围为0-59,但允许至61 秒 • int tm_min 代表目前分数,范围0-59 • int tm_hour 从午夜算起的时数,范围为0-23 • int tm_mday 目前月份的日数,范围01-31 • int tm_mon 代表目前月份,从一月算起,范围从0-11 • int tm_year 从1900 年算起至今的年数 • int tm_wday 一星期的日数,从星期一算起,范围为0-6 • int tm_yday 从今年1 月1 日算起至今的天数,范围为0365 • int tm_isdst 日光节约时间的旗标 • 此函数返回的时间日期未经时区转换,而是UTC时间。 • 返回值 返回结构tm代表目前UTC时间
• • • • • • • • • • • • • • main() { int fd; void *start; struct stat sb; fd=open("/etc/passwd",O_RDONLY); /*打开/etc/passwd*/ fstat(fd,&sb); /*取得文件大小*/ start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIV ATE,fd,0); if(start == MAP_FAILED) /*判断是否映射成功*/ return; printf("%s",start); munmap(start,sb.st_size); /*解除映射*/ close(fd); }

• • • •
• 返回值 成功则返回0,失败返回-1,错误代码存于 errno。 • 附加说明 EFAULT指针tv和tz 所指的内存空间超出存取权 限。
示例解析
• • • • • • • • • • • #include<sys/time.h> #include<unistd.h> main(){ struct timeval tv; struct timezone tz; gettimeofday (&tv , &tz); printf("tv_sec:%d\n", _sec) ; printf("tv_usec: %d\n",_usec); printf("tz_minuteswest:%d\n", tz.tz_minuteswest); printf("tz_dsttime: %d\n",tz.tz_dsttime); }
示例解析
• • • • • • /* 利用mmap()来读取/etc/passwd文件内容*/ #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<sys/mman.h>

localtime(取得当地目前时间和日期)
示例解析
• #include<time.h> • main(){ • char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat" }; • time_t timep; • struct tm *p; • time(&timep); • p=localtime(&timep); /*取得当地时间*/ • printf("%d%d%d",(1900+p->tm_year), (1+p->tm_mon),p>tm_mday); • printf("%s%d:%d:%d\n", wday[p->tm_wday],p->tm_hour, p->tm_min, p->tm_sec); • }
相关文档
最新文档