免费注册 查看新帖 |

Chinaunix

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

[C] 用C语言修改系统时区,发现一堆问题,请各位大侠不吝赐教。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-30 13:40 |只看该作者 |倒序浏览
10可用积分
已经实现,用system函数。但是strings 我的源文件,就能看见完整的sed命令。

已经搜索过google、baidu、chinaunix,用settimeofday函数改过时区,但是不能生效。也按照论坛某位大侠的指点(别人的问题帖子)去拜读了date的源代码,实在是资质愚努,摆之不平。

无奈采用替代方法,先将localtime文件link到/usr/share/zoneinfo/Asia/Shanghai,然后修改/etc/sysconfig/clock文件,将时区变为亚洲/上海。

问题是,
1、clock配置文件中,我如何只修改TIMEZONE而不改变DEFAULT_TIMEZONE的值呢?函数希望能够通用于修改其他配置文件,所以函数的修改不应该影响函数对其他配置文件的修改。
2、C语言中有没有一个类似sh中^字符的特殊字符。

本人C语言师傅只是google,出于需要使用C(也是练习目的),所以能解决问题就行了,无意对C进行通盘详细研究,遇到啥学啥。各位尽可能详细多说一些。

clock配置文件:
# cat /etc/sysconfig/clock     
## Path:                System/Environment/Clock
## Description:         Information about your timezone and time
## Type:                string
## ServiceRestart:      boot.clock
#
# Set to "-u" if your system clock is set to UTC, and to "--localtime"
# if your clock runs that way.
#
HWCLOCK="-u"
## Type:                string(Europe/Berlin,Europe/London,Europe/Paris)
## ServiceRestart:      boot.clock
#
# Timezone (e.g. CET)
# (this will set /usr/lib/zoneinfo/localtime)
#
TIMEZONE="Asia/Shanghai"
DEFAULT_TIMEZONE="US/Pacific"

源代码如下:
  tzset();
  printf("%s \n",*tzname);
  if (strcmp(*tzname,"CST"))
   {
     filename="/root/clock";
     key="\rTIMEZONE";
     value="\"Asia/Shanghai\"";
     changevalue(filename,key,value);
     unlink("/etc/localtime");
     link("/usr/share/zoneinfo/Asia/Shanghai","/etc/localtime");
   }

函数如下:
void changevalue(char *filename,char *key,char *value)
  {
          FILE *fin,*fout;
          char temp[1024],*ptr,**file,cmd_str[128];
          int i=0,j,n=0;
          /* 修改配置文件 */
          fin=fopen(filename,"r");
          while(fgets(temp,1024,fin))
       {
      i++;
    }
          rewind(fin);
          if(!(file=(char**)malloc(sizeof(char*)*i)))
       {
      exit(EXIT_FAIL);
    }
          for(j=0;j<i;j++)
       {
      if(!(file[j]=(char*)malloc(sizeof(char)*1024)))
      {
        exit(EXIT_FAIL);
      }
    }
          j=0;
          while(j<i)
          {
            fgets(temp,1024,fin);
            if(ptr=strstr(temp,key))
            {
              *(ptr+strlen(key)+1)=0;
              strcat(temp,value);
              strcat(temp,"\n");
     n=n+1;
            }
            strcpy(file[j++],temp);
          }
          fclose(fin);
          /* 输出配置文件 */
    if (n==1)
    {
      fout=fopen(filename,"w");
            j=0;
            while(j<i)
   {
     fputs(file[j++],fout);
   }
            fclose(fout);
            j=0;
            while(j<i)
   {
     free(file[j++]);
   }
    }
    else
       {
     printf("ERROR: The value %s in %s is not unique. \n",key,filename);
     exit(EXIT_FAIL);
       }
  }

论坛徽章:
0
2 [报告]
发表于 2007-10-04 10:11 |只看该作者
都在这放了快两天了。

是我提的问题不对,还是什么其他的原因?或者说,我一开始就选择了错误的方向?

希望各位C语言的前辈指教。

话说回来,没想到沉得这么快,这个帖子。

论坛徽章:
0
3 [报告]
发表于 2007-10-08 12:26 |只看该作者
好郁闷,请问各位版主不管能不能解决问题,回个贴,给个意见,可好?

论坛徽章:
0
4 [报告]
发表于 2007-10-09 19:25 |只看该作者
每天一顶,有益身心

论坛徽章:
0
5 [报告]
发表于 2007-10-10 13:28 |只看该作者
欣赏你的执着,帮你顶一下,看来我的c还不如你呢!没办法帮到你。

论坛徽章:
0
6 [报告]
发表于 2007-10-10 15:38 |只看该作者
是因为你问问题的方式。
你所说的修改时区好像只是修改一个配置文件。
既然都用system调用了修改如此简单的文件,为何不sed替换一下,拿出一堆这样的C代码来让人摸不着头脑。
>>2、C语言中有没有一个类似sh中^字符的特殊字符。
到现在都没看出来这什么意思?

论坛徽章:
0
7 [报告]
发表于 2007-10-11 13:17 |只看该作者
原帖由 nnnqpnnn 于 2007-10-10 15:38 发表
是因为你问问题的方式。
你所说的修改时区好像只是修改一个配置文件。
既然都用system调用了修改如此简单的文件,为何不sed替换一下,拿出一堆这样的C代码来让人摸不着头脑。
>>2、C语言中有没有一个类似sh中 ...



多谢你的回复。
我慢慢把问问题的方式改正过来。有没说清楚的地方吗?

论坛徽章:
0
8 [报告]
发表于 2007-10-12 17:08 |只看该作者
受教了。。。

论坛徽章:
0
9 [报告]
发表于 2007-10-12 17:18 |只看该作者
虽然不会,但我也学习学习,受教了

论坛徽章:
0
10 [报告]
发表于 2007-10-16 01:30 |只看该作者
再顶一把,直到大侠指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP