看板Maple
标 题Re: account.c 的上站人次统计问题
发信站清华资讯(枫桥驿站) (Sat Oct 12 17:46:14 2002)
转信站Ptt!news.cs.nthu!maple
小弟的bbs是20000606snap
照着这篇修改
执行 /home/bbs/bin/account 时
他会出现 can not open [run/tmp]
有 touch tmp 不过情况还是一样耶
还要修正那些地方呀
麻烦各位大大指点一下罗
※ 引述《jasonwu (黑暗之狐)》之铭言:
> ※ 引述《jasonwu (黑暗之狐)》之铭言:
> > 有个小小的bug,不知道之前有没有人提过?
> > 简而言之,
> > 如果你架的 bbs 站很不幸地在 23:00 - 23:59 之间都没人上站,
> > 那你今天一整天的上站人次记录就不会在sysop板上出现了。
> > 为解决这个小问题,我多加了如下的code:
> > rename(run_file, tmp_file);
> > if ((fp = fopen(tmp_file, "r")) == NULL)
> > {
> > /* jasonwu 20010508 : 如果目前是午夜 0 点 x 分,要记得先keeplog */
> > if (!ptime.tm_hour)
> > keeplog(fn_today, NULL, "[记录] 上站人次统计", 1);
> > error(tmp_file);
> > }
> > if ((fpw = fopen(log_file, "a")) == NULL)
> > error(log_file);
> > 若有问题请大家多多指正... 谢谢... :)
> 真抱歉...其实小弟发现仅这样改并不够,
> 还是有其它问题要解决。
> 因为後面还是有一些动作应该是要每个小时都得做检查和处理的,
> 比如把一整天人次统计的档案(@-act)换成另一个档名(@=act)当作是昨日人次统计。
> 另外还有 @-act 这档案理论上应该是要一个小时就一定得更新一次,
> 然而实际上并没有... 等...。
> 如果一个个把这些动作通通加在我原文加的code之下,
> 显然不是一个有效率的方法。
> 事实上,从那段code的角度上去看,
> 我们可以发现 fopen(tmp_file) 的动作只是为了在一个回圈中去计算act[]的新数值。
> 没有tmp_file,act[]数值当然不会变动。
> 而act[]就是从午夜十二点开始算起到现在的各时段统计人数,
> 它会在开始就由底下几行叙述取得资料:
> memset(act, 0, sizeof(act)); /* 初始化 act 阵列里的资料皆为 0 */
> fact = open(act_file, O_RDWR | O_CREAT, 0600);
> if (fact < 0)
> error(act_file);
> /* 不是午夜(00:xx)的话就去读 run/var/act */
> /* 不然的话 act 的值都将会是 0 */
> if (ptime.tm_hour != 0)
> {
> read(fact, act, sizeof(act));
> lseek(fact, 0, SEEK_SET);
> }
> 所以我们可以这麽想:
> 『如果 tmp_file 不存在,那就没必要让其去跑计算act[]的回圈』
> 所以我们可以舍弃我原先post的做法,
> 改成多加如下的code:(以黄色表示多加的内容)
> ...
> ...
> int tmp_exist_flag; /* jasonwu 20010509:指示tmp_file是否存在的旗标 */
> ...
> ...
> rename(run_file, tmp_file);
> if ((fp = fopen(tmp_file, "r")) == NULL)
> tmp_exist_flag = 0; /* jasonwu 20010509: 设定旗标表示tmp_file并不存在 */
> else
> tmp_exist_flag = 1; /* jaosnwu 20010509: 设定旗标表示tmp_file存在 */
> ...
> ...
> /* jasonwu 20010509 : 修正在午夜执行时tmp_file不存在的问题 */
> if(tmp_exist_flag == 1) /* tmp_file存在,才会去统计过去一小时来上站人次 */
> {
> while (fgets(buf, sizeof(buf), fp))
> {
> fputs(buf, fpw);
> if (!memcmp(buf + 22, "ENTER", 5))
> {
> hour = atoi(buf + 9);
> if (hour >= 0 && hour <= 23)
> act[hour]++;
> continue;
> }
> if (!memcmp(buf + 41, "Stay:", 5))
> {
> if (hour = atoi(buf + 47))
> {
> act[24] += hour;
> act[25]++;
> }
> continue;
> }
> }
> fclose(fp);
> unlink(tmp_file);
> } /*别忘了右括号 */
> fclose(fpw);
> 若还有问题请大家指正...谢谢... :)
引
言
过
多
!
.
.
.
.
.
.
.
.
.
.
.
--
※ Origin: 枫桥驿站<bbs.cs.nthu.edu.tw> ◆ From: 229047.D18-229.ncu.edu.tw