Re: account.c 的上站人次統計問題
小弟的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
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
Maple 近期熱門文章
PTT數位生活區 即時熱門文章
                            32
                        
                            67