您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > 第6章 Linux编程―内存分配与时间函数
LinuxLinux操作系统操作系统•大工软件学院嵌入式系邱铁办公楼409Tel:87571521E_mail:qiutie@sohu.com第6章Linux编程—内存分配与时间函数Calloc(配置内存空间)示例解析•/*动态配置10个structtest空间*/•#includestdlib.h•structtest•{•inta[10];•charb[20];•}•main()•{•structtest*ptr=calloc(sizeof(structtest),10);•}free(释放原先配置的内存)getpagesize(取得内存分页大小)示例解析•#includeunistd.h•main()•{•printf(pagesize=%d\n,getpagesize());•}malloc(配置内存空间)示例解析•#includeunistd.h•main()•{•char*p=(char*)(malloc(1024));/*配置1k的内存*/•}mmap(建立内存映射)续•参数flags会影响映射区域的各种特性:•MAP_FIXED如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励用此旗标。•MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。•MAP_PRIVATE对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copyonwrite)对此区域作的任何修改都不会写回原来的文•件内容。•MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。•MAP_DENYWRITE只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。•MAP_LOCKED将映射区域锁定住,这表示该区域不会被置换(swap)。续•在调用mmap()时必须要指定MAP_SHARED或MAP_PRIVATE。参数fd为open()返回的文件描述词,代表欲映射到内存的文件。参数offset为文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。•返回值•若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno中。续•错误代码•EBADF参数fd不是有效的文件描述词•EACCES存取权限有误。如果是MAP_PRIVATE情况下文件必须可读,使用MAP_SHARED则要有PROT_WRITE以及该文件要能写入。•EINVAL参数start、length或offset有一个不合法。•EAGAIN文件被锁住,或是有太多内存被锁住。•ENOMEM内存不足。示例解析•/*利用mmap()来读取/etc/passwd文件内容*/•#includesys/types.h•#includesys/stat.h•#includefcntl.h•#includeunistd.h•#includesys/mman.h续•main()•{•intfd;•void*start;•structstatsb;•fd=open(/etc/passwd,O_RDONLY);/*打开/etc/passwd*/•fstat(fd,&sb);/*取得文件大小*/•start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);•if(start==MAP_FAILED)/*判断是否映射成功*/•return;•printf(%s,start);•munmap(start,sb.st_size);/*解除映射*/•close(fd);•}munmap(解除内存映射)Asctime将时间和日期以字符串格式表示示例解析•#includetime.h•main()•{•time_ttimep;•time(&timep);•printf(%s,asctime(gmtime(&timep)));•}gettimeofday(取得目前的时间)•表头文件#includesys/time.h#includeunistd.h•定义函数intgettimeofday(structtimeval*tv,structtimezone*tz)•函数说明gettimeofday()会把目前的时间有tv所指的结构返回,当地时区的信息则放到tz所指的结构中。timeval结构定义为:structtimeval{longtv_sec;/*秒*/longtv_usec;/*微秒*/};续•timezone结构定义为:structtimezone{inttz_minuteswest;/*和Greenwich时间差了多少分钟*/inttz_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年以后)*/•返回值成功则返回0,失败返回-1,错误代码存于errno。•附加说明EFAULT指针tv和tz所指的内存空间超出存取权限。示例解析•#includesys/time.h•#includeunistd.h•main(){•structtimevaltv;•structtimezonetz;•gettimeofday(&tv,&tz);•printf(tv_sec:%d\n,tv.tv_sec);•printf(tv_usec:%d\n,tv.tv_usec);•printf(tz_minuteswest:%d\n,tz.tz_minuteswest);•printf(tz_dsttime:%d\n,tz.tz_dsttime);•}gmtime(取得目前时间和日期)•表头文件#includetime.h•定义函数structtm*gmtime(consttime_t*timep);•函数说明•gmtime()将参数timep所指的time_t结构中的信息转换成真实世界•所使用的时间日期表示方法,然后将结果由结构tm返回。结构tm的定义为:•structtm•{•inttm_sec;•inttm_min;•inttm_hour;•inttm_mday;•inttm_mon;•inttm_year;•inttm_wday;•inttm_yday;•inttm_isdst;•};续•inttm_sec代表目前秒数,正常范围为0-59,但允许至61秒•inttm_min代表目前分数,范围0-59•inttm_hour从午夜算起的时数,范围为0-23•inttm_mday目前月份的日数,范围01-31•inttm_mon代表目前月份,从一月算起,范围从0-11•inttm_year从1900年算起至今的年数•inttm_wday一星期的日数,从星期一算起,范围为0-6•inttm_yday从今年1月1日算起至今的天数,范围为0-365•inttm_isdst日光节约时间的旗标•此函数返回的时间日期未经时区转换,而是UTC时间。•返回值返回结构tm代表目前UTC时间示例解析•#includetime.h•main(){•char*wday[]={Sun,Mon,Tue,Wed,Thu,Fri,Sat};•time_ttimep;•structtm*p;•time(&timep);•p=gmtime(&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);•}localtime(取得当地目前时间和日期)示例解析•#includetime.h•main(){•char*wday[]={Sun,Mon,Tue,Wed,Thu,Fri,Sat};•time_ttimep;•structtm*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);•}settimeofday(设置目前时间)time(取得目前的时间)示例解析•#includetime.h•main()•{•intseconds=time((time_t*)NULL);•printf(“%d\n”,seconds);•}
本文标题:第6章 Linux编程―内存分配与时间函数
链接地址:https://www.777doc.com/doc-6327298 .html