sql/sql_show.cc文件中实现
void mysqld_list_processes(THD *thd,const char *user, bool verbose)
{
Item *field;
List<Item> field_list;
I_List<thread_info> thread_infos;
ulong max_query_length= (verbose ? thd->variables.max_allowed_packet :
PROCESS_LIST_WIDTH);
Protocol *protocol= thd->protocol;
DBUG_ENTER("mysqld_list_processes");
field_list.push_back(new Item_int("Id", 0, MY_INT32_NUM_DECIMAL_DIGITS));
field_list.push_back(new Item_empty_string("User",16));
field_list.push_back(new Item_empty_string("Host",LIST_PROCESS_HOST_LEN));
field_list.push_back(field=new Item_empty_string("db",NAME_CHAR_LEN));
field->maybe_null=1;
field_list.push_back(new Item_empty_string("Command",16));
field_list.push_back(field= new Item_return_int("Time",7, MYSQL_TYPE_LONG));
field->unsigned_flag= 0;
field_list.push_back(field=new Item_empty_string("State",30));
field->maybe_null=1;
field_list.push_back(field=new Item_empty_string("Info",max_query_length));
field->maybe_null=1;
=====?
三个步骤:
1.先定义id,user,Host,db,Command,Time,State,Info字段信息到field_list变量中,并通过protocol->send_fields发送到客户端
2. 锁定线程总数,遍历所有线程,将所有线程的信息填入thread_infos链表变量中
向客户端传送thread_infos链表中的数据,通过protocol->write()完成写操作
实际中遇到的问题:
如果一个mysql线程很多,那么大部份的sleep线程将干扰查看processlist列表