欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    互联网络程序设计实验实验(共4页).docx

    • 资源ID:13675768       资源大小:17.16KB        全文页数:4页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    互联网络程序设计实验实验(共4页).docx

    精选优质文档-倾情为你奉上实验5 定时器【实验原理】timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景。timerfd是linux内核2.6.25版本中加入的接口。timerfd、eventfd、signalfd配合epoll使用,可以构造出一个零轮询的程序,但程序没有处理的事件时,程序是被阻塞的。这样的话在某些移动设备上程序更省电。clock_gettime函数可以获取系统时钟,精确到纳秒。需要在编译时指定库:-lrt。可以获取两种类型事件:CLOCK_REALTIME:相对时间,从1970.1.1到目前的时间。更改系统时间会更改获取的值。也就是,它以系统时间为坐标。CLOCK_MONOTONIC:与CLOCK_REALTIME相反,它是以绝对时间为准,获取的时间为系统重启到现在的时间,更改系统时间对齐没有影响。timerfd_create:生成一个定时器对象,返回与之关联的文件描述符。接收两个入参,一个是clockid,填写CLOCK_REALTIME或者CLOCK_MONOTONIC,参数意义同上。第二个可以传递控制标志:TFD_NONBLOCK(非阻塞),TFD_CLOEXEC(同O_CLOEXEC)注:timerfd的进度要比usleep要高。timerfd_settime:能够启动和停止定时器;可以设置第二个参数:flags,0表示是相对定时器,TFD_TIMER_ABSTIME表示是绝对定时器。第三个参数设置超时时间,如果为0则表示停止定时器。定时器设置超时方法:1、设置超时时间是需要调用clock_gettime获取当前时间,如果是绝对定时器,那么需要获取CLOCK_REALTIME,在加上要超时的时间。如果是相对定时器,要获取CLOCK_MONOTONIC时间。2、数据结构: struct timespec time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds */ ; struct itimerspec struct timespec it_interval; /* Interval for periodic timer */ struct timespec it_value; /* Initial expiration */ ; it_value是首次超时时间,需要填写从clock_gettime获取的时间,并加上要超时的时间。 it_interval是后续周期性超时时间,是多少时间就填写多少。注意一个容易犯错的地方:tv_nsec加上去后一定要判断是否超出(如果超过要秒加一),否则会设置失败。it_interval不为0则表示是周期性定时器。it_value和it_interval都为0表示停止定时器。注:timerfd_create第一个参数和clock_gettime的第一个参数都是CLOCK_REALTIME或者CLOCK_MONOTONIC,timerfd_settime的第二个参数为0(相对定时器)或者TFD_TIMER_ABSTIME,三者的关系:1、如果timerfd_settime设置为TFD_TIMER_ABSTIME(决定时间),则后面的时间必须用clock_gettime来获取,获取时设置CLOCK_REALTIME还是CLOCK_MONOTONIC取决于timerfd_create设置的值。2、如果timerfd_settime设置为0(相对定时器),则后面的时间必须用相对时间,就是: new_value.it_value.tv_nsec = ; new_value.it_value.tv_sec = 3; new_value.it_interval.tv_sec = 0; new_value.it_interval.tv_nsec = ;read函数可以读timerfd,读的内容为uint_64,表示超时次数。【实验源码】#include <sys/timerfd.h>#include <time.h>#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <stdint.h> /* Definition of uint64_t */#define handle_error(msg) do perror(msg); exit(EXIT_FAILURE); while (0)static void print_elapsed_time(void) static struct timespec start; struct timespec curr; static int first_call = 1; int secs, nsecs; if (first_call) first_call = 0; if (clock_gettime(CLOCK_MONOTONIC, &start) = -1) handle_error("clock_gettime"); if (clock_gettime(CLOCK_MONOTONIC, &curr) = -1) handle_error("clock_gettime"); secs = curr.tv_sec - start.tv_sec; nsecs = curr.tv_nsec - start.tv_nsec; if (nsecs < 0) secs-; nsecs += ; printf("%d.%03d: ", secs, (nsecs + ) / );Int main(int argc, char *argv) struct itimerspec new_value; int max_exp, fd; struct timespec now; uint64_t exp, tot_exp; ssize_t s; if (argc != 2) && (argc != 4) fprintf(stderr, "%s init-secs interval-secs max-expn", argv0); exit(EXIT_FAILURE); if (clock_gettime(CLOCK_REALTIME, &now) = -1) handle_error("clock_gettime"); /* Create a CLOCK_REALTIME absolute timer with initial expiration and interval as specified in command line */ new_value.it_value.tv_sec = now.tv_sec + atoi(argv1); new_value.it_value.tv_nsec = now.tv_nsec; if (argc = 2) new_value.it_interval.tv_sec = 0; max_exp = 1; else new_value.it_interval.tv_sec = atoi(argv2); max_exp = atoi(argv3); new_value.it_interval.tv_nsec = 0; fd = timerfd_create(CLOCK_REALTIME, 0); if (fd = -1) handle_error("timerfd_create"); if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) = -1) handle_error("timerfd_settime"); print_elapsed_time(); printf("timer startedn"); for (tot_exp = 0; tot_exp < max_exp;) s = read(fd, &exp, sizeof(uint64_t); if (s != sizeof(uint64_t) handle_error("read"); tot_exp += exp; print_elapsed_time(); printf("read: %llu; total=%llun", (unsigned long long) exp, (unsigned long long) tot_exp); exit(EXIT_SUCCESS);专心-专注-专业

    注意事项

    本文(互联网络程序设计实验实验(共4页).docx)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开