免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7061 | 回复: 6
打印 上一主题 下一主题

[学习] linux下settimeofday函数调用失败,何故? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:56:11操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-25 23:48 |只看该作者 |倒序浏览
GCC成功,可以运行,但就是该函数调用失败,返回值-1;
我用ROOT帐号GCC,再执行,也是这样。
--------------------------------------------------------------
#include   <stdio.h>
#include<sys/time.h>
#include<unistd.h>
#include "stdlib.h"
   
int   main(void)     
{     
       struct     tm   *t_tm;
       struct timeval t_timeval;
       time_t t_timet;


        t_timet=time(NULL);
        t_tm=localtime(&t_timet);
        printf("\n\ncurrent system  UTC time:%s\n", asctime(t_tm));

        t_tm->tm_hour=18;
        t_tm->tm_min=18;
        t_tm->tm_sec=18;
        t_tm->tm_year=18;
        t_tm->tm_mon=5; //月份(从一月开始,0代表一月) - 取值区间为[0,11]
        t_tm->tm_mday=18;  //年份,其值从1900开始

        t_timet=mktime(t_tm);

        t_timeval.tv_sec=t_timet;
        t_timeval.tv_usec=0;

        int rec = settimeofday(&t_timeval,NULL);

        printf("modifyed  time:%s\nsettime return code:%d\n\n", asctime(t_tm),rec);

        //printf("local time:%s\n", ctime(&tvt));
       return   0;     
}

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:56:11操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
2 [报告]
发表于 2014-11-26 22:56 |只看该作者
找到问题了,出在 这一行:t_timeval.tv_sec=t_timet;  该长整型数最后为负数,所以至错。

导致负数的原因在于   t_tm->tm_year=18;该数据是以 1900的相对值。这里18,就相当于是指定为1918年,而计算机表示的时间范围是自1970年以来的时间秒数累积,于是1918-1970自然就是负数了。

现在将这些写出来,供和我一样的初学者参考。

补充一点,linux 32位系统目前表示的年限在2038年。也就是说linux设置时间暂时不能超过这个数。有兴趣的同学可以用date命令测试一下,年数设置为2039就为非法的。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:56:11操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
3 [报告]
发表于 2014-11-26 22:58 |只看该作者
而且,我还发现settimeofday这外函数,将时间写入硬件了。

因为我重启系统后,时间并没自己改回去。(见网上说的,这个命令只是改了系统时间,而没改硬件CMOS的时间)

有兴趣的同学,自己试试哈

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
4 [报告]
发表于 2014-11-27 09:56 |只看该作者
回复 3# miniboy
我觉得是当时没有修改,关机的时候是会写到硬件中的

   

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
5 [报告]
发表于 2014-11-27 20:58 |只看该作者
升到64位系统,64位的秒数范围,可以用到天荒地老!

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:56:11操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
6 [报告]
发表于 2014-11-29 01:31 |只看该作者
爻易 发表于 2014-11-27 20:58
升到64位系统,64位的秒数范围,可以用到天荒地老!



哈哈,无所谓了。现在才2014年。2037年,还有20多年呢。到那时,我还会再玩这个么???

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
7 [报告]
发表于 2014-11-29 11:40 |只看该作者
也是啊,这些微秒级的函数还没等混熟,操作系统已经支持纳秒级的系统调用了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP