Chinaunix

标题: 用C语言修改系统时区,发现一堆问题,请各位大侠不吝赐教。 [打印本页]

作者: hex_618    时间: 2007-09-30 13:40
标题: 用C语言修改系统时区,发现一堆问题,请各位大侠不吝赐教。
已经实现,用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);
       }
  }
作者: hex_618    时间: 2007-10-04 10:11
都在这放了快两天了。

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

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

话说回来,没想到沉得这么快,这个帖子。
作者: hex_618    时间: 2007-10-08 12:26
好郁闷,请问各位版主不管能不能解决问题,回个贴,给个意见,可好?
作者: hex_618    时间: 2007-10-09 19:25
每天一顶,有益身心
作者: kai0200    时间: 2007-10-10 13:28
欣赏你的执着,帮你顶一下,看来我的c还不如你呢!没办法帮到你。
作者: nnnqpnnn    时间: 2007-10-10 15:38
是因为你问问题的方式。
你所说的修改时区好像只是修改一个配置文件。
既然都用system调用了修改如此简单的文件,为何不sed替换一下,拿出一堆这样的C代码来让人摸不着头脑。
>>2、C语言中有没有一个类似sh中^字符的特殊字符。
到现在都没看出来这什么意思?
作者: hex_618    时间: 2007-10-11 13:17
原帖由 nnnqpnnn 于 2007-10-10 15:38 发表
是因为你问问题的方式。
你所说的修改时区好像只是修改一个配置文件。
既然都用system调用了修改如此简单的文件,为何不sed替换一下,拿出一堆这样的C代码来让人摸不着头脑。
>>2、C语言中有没有一个类似sh中 ...



多谢你的回复。
我慢慢把问问题的方式改正过来。有没说清楚的地方吗?
作者: imdemon    时间: 2007-10-12 17:08
受教了。。。
作者: joneson119    时间: 2007-10-12 17:18
虽然不会,但我也学习学习,受教了
作者: hex_618    时间: 2007-10-16 01:30
再顶一把,直到大侠指教
作者: isnowran    时间: 2007-10-16 02:06
1. 如果仅仅是修改时区, 好像不用关心clock文件, 只需要把localtime换为链接指向你希望设置的时区文件即可 (具体的时区文件系统里有很多, 不用关心其内容).

2. 如果仅仅是应用, 建议你用shc把你现有的shell文件直接加密得了, 不用理会C语言.
作者: hex_618    时间: 2007-10-19 11:54
1. 如果仅仅是修改时区, 好像不用关心clock文件, 只需要把localtime换为链接指向你希望设置的时区文件即可 (具体的时区文件系统里有很多, 不用关心其内容).
纯粹个人习惯,虽然我不知道需要改多少个配置文件,但知道的还是习惯性改掉。

2. 如果仅仅是应用, 建议你用shc把你现有的shell文件直接加密得了, 不用理会C语言.
多谢,还需要安装一个额外的软件包,这个不太符合我的安全习惯。也许我能先在某台demo机上静态编译成功,然后再拿到其他设备上使用。
使用方法:http://www.nixsky.com/program/shell/2007-04/103.html
我马上去试试。

改配置文件的问题,我自己再想想新的方法,完善这个函数。
作者: hex_618    时间: 2007-11-02 15:25
shc不太好用,对于sqlplus的转换存在问题,而且在我要使用的操作系统中,编译sh存在告警,完成的代码一执行就变成僵尸进程。
作者: hex_618    时间: 2007-11-05 14:27
已经验证shc-3.8.6.tar存在版本不兼容问题。
对于suse 9,未升级至191smp之前,可以使用。升级后,编译出来的加密脚本一执行就变成僵尸进程。
已经进行了充分验证。

特补充说明在这个帖子的最后,也算是结贴。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2