CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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);
}


[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.