| [ CnUnix ] in KIDS 글 쓴 이(By): guest (guest) <203.239.179.5> 날 짜 (Date): 2002년 5월 4일 토요일 오후 02시 23분 42초 제 목(Title): Re: [질문] kstat_read kstat_lookup() 이나 kstat_data_lookup() 은 안 썼고요. 왜냐면 module name이나 data 안의 name (KSTAT_TYPE_NAMED인경우)을 모르 고 전부 listing 하고 싶어서죠. 지금 현재는 chain을 따라가면서 loop 로 ks_type 을 비교해서 KSTAT_TYPE_NAMED 인 경우만 kstat_read()하고 ks_ndata 만큼 loop 를 돌면서 sizeof(kstat_named_t) 만큼 메모리 잡고 name과 value를 뿌려주고 있어여. 그런데, 제가 문의 드리는 것은 ks_data 안의 레코드가 1개 이상 있을때 하나의 레코드만 뽑는 방법이 따로 있는가 하는 거죠. 지그은 그냥 memcpy 하고 있거든요. 쩝 .. 쓰고보니 너무 바보 같은 질문이네요. 그리고 또하나... ks_type이 KSTAT_TYPE_IO 인 경우 데이터를 받아보면 nwritten이나 writes 등은 제대로 나오는데 nread나 reads같은 넘들은 왜 전부 0 으로 나올까요? 데이터 타입도 같은데.. 하여간 제 코드는 main()에서 kstat_open 한 kc를 받아서.. (무척이나 비효율적인거 같아서 말이죠.) int listnamed(kc) kstat_ctl_t *kc; { kstat_t *ksp; kstat_named_t *knt; int t; knt = (kstat_named_t *)malloc(sizeof(kstat_named_t)); for (ksp = kc->kc_chain; ksp != NULL; ksp = ksp->ks_next) { if (ksp->ks_type == KSTAT_TYPE_NAMED ) { printf( "%s %d %s\n", ksp->ks_module, ksp->ks_instance, ksp->ks_name); kstat_read(kc, ksp, 0); for (t = 0 ; t < sizeof(kstat_named_t) * ksp->ks_ndata ; t = t + sizeof(kstat_named_t)) { memcpy(knt, ksp->ks_data+t, sizeof(kstat_named_t)); printf("\t\t%s\t%d\n", knt->name, knt->value.ul); } } } free(knt); } |