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數位生活區 即時熱門文章
-4
30