- 主题:有没有统计已注册用户数的代码?
刚才那段代码全是加在ucache.c里的struct UCACHE后面的
idnumber定义在函数外部,应该是全局了吧
我还试过在struct UCACHE里面加了一个int totaluser,直接就BBS起不来了
【 在 atppp (Big Mouse) 的大作中提到: 】
: 你的idnumber定义在什么地方的
: 详细阿,说详细阿。。。
--
FROM 211.151.95.*
【 在 cometcaptor (参宿四[☆]一闪一闪亮晶晶) 的大作中提到: 】
: 加了一个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
还有,countidnumber具体是在那个位置调用的,不要只说是在这个函数里面,放在什么
位置,有没有放在if里面,差别可就大了。问问题最忌讳的就是太自信。。。觉得
自己有些地方是绝对不会搞错的,于是就不说详细。。。
--
FROM 61.182.213.*
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.*
load_ucache是miscd daemon启动的时候才会调用的函数
别的进程都只是调用resolve_ucache来attach uidshm
而你的idnumber定义的是ucache.c里面的全局变量,各进程是独立的。
所以你只是修改了miscd某个进程当中的idnumber,而别的所有进程的idnumber还保持
他们原始的全局变量默认初始值0。
你可以把idnumber放入UCACHE结构当中,这样就属于uidshm这个共享内存的一部分,
你在miscd进程修改了,别的进程也都会看到这个修改。但是要注意UCACHE结构是
共享内存结构,直接决定共享内存大小,如果你修改了这个,必须完全停止系统
重新编译,完全清理掉共享内存,重新启动系统。精华区里面有我写的如何重启动
系统的说明。如果这里你出了一点点小差错,就会造成各个进程认为共享内存结构
不同,读写就会完全乱掉...
【 在 cometcaptor (参宿四[☆]一闪一闪亮晶晶) 的大作中提到: 】
: 这样的
: struct UCACHE {
: ucache_hashtable hashtable;
: ...................
--
FROM 61.182.213.*
对了你在flush_ucache里面更新这个的话,那就只有定时更新。
如果你要进站时实时显示当前注册用户数,list.c里面貌似已经有一个allusers()函数了,
只不过每次都要遍历比较费罢了...小站就无所谓了...
【 在 cometcaptor (参宿四[☆]一闪一闪亮晶晶) 的大作中提到: 】
: 这样的
: struct UCACHE {
: ucache_hashtable hashtable;
: ...................
--
FROM 61.182.213.*
嗯,我一开始就是每次遍历的,只是因为总觉得这样做太暴力了,也算是个隐性的瓶颈
所以就想写到共享内存。alluser看过的,觉得也和进站时手工遍历差不多的样子
by the way,什么时候会flush啊?update_user的时候会吗?系统在什么时候杀掉那些
生命力为0的ID啊? //3x~~
【 在 atppp (Big Mouse) 的大作中提到: 】
: 对了你在flush_ucache里面更新这个的话,那就只有定时更新。
: 如果你要进站时实时显示当前注册用户数,list.c里面貌似已经有一个allusers()函数了,
: 只不过每次都要遍历比较费罢了...小站就无所谓了...
: ...................
--
FROM 211.151.95.*
原来如此,谢谢~
【 在 etnlegend (etn|若即若离·神话再续) 的大作中提到: 】
: 看看 miscd 的 killd...
--
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; //自己加的
};
然后
static void countidnumber(void)
{
int i,idnum=0;
for (i=0;i<MAXUSERS;i++)
if (uidshm->passwd[i].userid[0])
idnum++;
uidshm->idnumber = idnum;
}
int getidnumber(void)
{
int i,fd;
fd = ucache_lock();
i = uidshm->idnumber;
ucache_unlock(fd);
return i;
}
在flush_ucache的return前加上countidnumber();
在load_ucache的ucache_unlock(fd)前加上countidnumber();
然后BBS又上不了了。本地telnet 127.0.0.1显示
Trying 127.0.0.1...
Connected to localhost.flstu.
Escape character is '^]'.
Error! shmget error! key = x.
Connection closed by foreign host.
【 在 cometcaptor (参宿四[☆]一闪一闪亮晶晶) 的大作中提到: 】
: 原来如此,谢谢~
--
FROM 211.151.95.*