- 主题:有没有统计已注册用户数的代码?
本来放在进站时自己遍历了一次,但是觉得效率不高,于是放在ucache里,但怎么也
不能正常使用,再尝试修改了UCACHE的结构,结果BBS就起不来了……
有没有好一点的方法啊...
--
FROM 211.151.95.*
嗯,我就是觉得每次遍历很傻的。但是放哪?难道放在文件?共享内存好像我写不进去
【 在 etnlegend (etn|若即若离·神话再续) 的大作中提到: 】
: 注册用户是有 R 权限的用户?
: 那没必要总去遍历啊... 算一次然后存在什么地方, 以后站务有 A-R 操作的时候
: 或者集中自动通过注册的时候改写一次就好... 别的时候都从那个地方读...
: ...................
--
修改:cometcaptor FROM 211.151.95.*
FROM 211.151.95.*
嗯,我是想用定期遍历的方法,在load_ucache、flush_ucache的时候遍历一次,在
update_user的时候把它+1,问题是我在ucache.c里加一个int idnumber然后在load_
ucache的时候遍历过了却不能把idnumber的值返回……如果想在共享内存里加这么个
int要怎么做才比较好?
【 在 flyriver (江~~忙碌生活) 的大作中提到: 】
: 你恐怕只能遍历,或者至少要定期遍历。
: 因为还要考虑到有人自杀,有人被系统杀档,而且还有人是直接改权限通过注册的...
--
FROM 211.151.95.*
为什么我在ucache里添个int然后去读它每次都会返回0啊...
【 在 etnlegend (etn|若即若离·神话再续) 的大作中提到: 】
: 啊... 原来有这么多洞, 想简单了- -
--
FROM 211.151.95.*
重启了的,连虚拟机都重启了……
【 在 atppp (Big Mouse) 的大作中提到: 】
: 你改完了有没有清共享内存重启动整个程序阿
--
FROM 211.151.95.*
加了一个int idnumber;
void countidnumber(void)
{
int i;
idnumber = 0;
for (i=0;i<MAXUSERS;i++)
if (uidshm->passwd[i].userid[0]!='\0')
idnumber++;
}
int getidnumber(void)
{
return idnumber;
}
然后在load_ucache和flush_ucache里countidnumber,登录时getidnumber,但是返回0
【 在 atppp (Big Mouse) 的大作中提到: 】
: 那么就把你的代码改动了什么,做了什么操作都详细的写出来。。。
--
FROM 211.151.95.*
刚才那段代码全是加在ucache.c里的struct UCACHE后面的
idnumber定义在函数外部,应该是全局了吧
我还试过在struct UCACHE里面加了一个int totaluser,直接就BBS起不来了
【 在 atppp (Big Mouse) 的大作中提到: 】
: 你的idnumber定义在什么地方的
: 详细阿,说详细阿。。。
--
FROM 211.151.95.*
countidnumber放在load_ucache,flush_ucache的return前面
【 在 atppp (Big Mouse) 的大作中提到: 】
: 还有,countidnumber具体是在那个位置调用的,不要只说是在这个函数里面,放在什么
: 位置,有没有放在if里面,差别可就大了。问问题最忌讳的就是太自信。。。觉得
: 自己有些地方是绝对不会搞错的,于是就不说详细。。。
: ...................
--
FROM 211.151.95.*
这样的
struct UCACHE {
ucache_hashtable hashtable;
ucache_hashtable hashusage;
int hashhead[UCACHE_HASHSIZE + 1];
int next[MAXUSERS];
time_t uptime;
int number;
#ifdef HAVE_CUSTOM_USER_TITLE
char user_title[255][USER_TITLE_LEN]; //定义用户的称号字符串。
#endif
struct userec passwd[MAXUSERS];
};
//上面是原来的下面自己加的
int idnumber;
void countidnumber(void)
{
int i;
idnumber = 0;
for (i=0;i<MAXUSERS;i++)
if (uidshm->passwd[i].userid[0]!='\0')
idnumber++;
}
int getidnumber(void)
{
return idnumber;
}
在load_ucache尾部
ucache_unlock(fd);
countidnumber();
return 0;
}
flush_ucache尾部
countidnumber();
return ret;
}
【 在 cometcaptor (参宿四[☆]一闪一闪亮晶晶) 的大作中提到: 】
: countidnumber放在load_ucache,flush_ucache的return前面
--
FROM 211.151.95.*
先去做实验,先谢谢at3p一个
【 在 cometcaptor (参宿四[☆]一闪一闪亮晶晶) 的大作中提到: 】
: 这样的
: struct UCACHE {
: ucache_hashtable hashtable;
: ...................
--
FROM 211.151.95.*