linux C取得プロセスのCPUとメモリ

1751 ワード

メモリを取得してgetrusageを試してみると、数値はずっと0で、、、後で資料を調べてみると、この関数のメモリに関するフィールドはまだ実現していません(unmaintained).
statmを使用すると、rssビットとdataビットはtop時に表示されたメモリが低下しても数値は変わらず、residentフィールドで現在のプロセスが占有する内部のみを取得できます.
size       (1) total program size                              (same as VmSize in/proc/[pid]/status)                   resident   (2) resident set size                              (same as VmRSS in/proc/[pid]/status)                   share      (3) shared pages (i.e., backed by a file)                   text       (4) text (code)                   lib        (5) library (unused in Linux 2.6)                   data       (6) data + stack                   dt         (7) dirty pages (unused in Linux 2.6)
            FILE *f = fopen("/proc/self/statm","r");
        if(f){
             i = fscanf(f,"%u%u%u%u%u%u%u",
            &n_rss,&n_resident,&n_share,&n_text,&n_lib,&n_data,&n_dt);
             
            fclose(f);
        }
        else
        {
            IMIO::instance()->log(INFO, "open /proc/self/statm fail");
        }
        n_rss = n_resident * 4 / 1024;
        if (n_rss < 1024*1.5 && s_freereq.size() > s_threadnum/3)
        {
            return ;
        }
        static unsigned int s_CLOCKS_PER_SEC_100 = CLOCKS_PER_SEC / 100;
        clock_t ct0, ct1; 
        ct0 = clock ();
        sleep(1);
        ct1 = clock ();
    
        char buf[256];
        sprintf(buf, "rss=%u,mshare=%u;freereq=%ld;cpu=%ld;", n_rss, n_share/1024, s_freereq.size(), (ct1 - ct0) /s_CLOCKS_PER_SEC_100);