2011年9月11日 星期日

取得與設定系統資源

標頭檔
#include <sys/resouece.h>

函式定義
int getpriority(int which, id_t who) 取得優先權設定資料
int setpriority(int which, id_t who, int priority) 設定優先權
int getrlimit(int resource, struct rlimit *r_limit) 取得系統資源限制資料
int setrlimit(int resource, conset struct rlimit *r_limit) 設定系統限制資源資料
int getrusage(int who, struct rusage *r_usage) 取得CPU 消耗時間資料

程式說明
取得CPU 使用資訊與設定系統資源限制,並設定檔案限制測試產生錯誤訊息。

編譯方式
gcc -o limit limit.c -lm

執行結果
$./limit
$CPU usage: user = 0.000000, system = 0,009998
current priority = 0
current FSIZE limit: soft=-1, hard=-1
seeting a 2k file zise limit
檔案大小超過上限

程式碼
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <sys/types.h>
#include <sys/resource.h>
#include <sys/times.h>

void work()
{
    FILE *f;
    int i;
    double x = 4.5;

    f = tmpfile();

    for(i = 0; i < 10000; i++){
        fprintf(f, "do some output\n");
        if(ferror(f)){
            fprintf(stderr, "error writing to tmporary file\n");
            exit(1);
        }
    }

    for(i = 0; i < 10000; i++){
        x = log(x*x + 3.21);
    }
}
int main()
{
    struct rusage r_usage;
    struct rlimit r_limit;
    int priority;

    work();

    getrusage(RUSAGE_SELF, &r_usage);

    /*取的CPU 使用資訊*/
    printf("CPU usage: user = %ld.%06ld, system = %ld,%06ld\n",
            r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec,
            r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec);

    /*取的目前優先權狀況*/
    priority = getpriority(PRIO_PROCESS, getpid());
    printf("current priority = %d\n", priority);

    /*檔案限制狀況*/
    getrlimit(RLIMIT_FSIZE, &r_limit);
    printf("current FSIZE limit: soft=%ld, hard=%ld\n",
            r_limit.rlim_cur, r_limit.rlim_max);

    /*設定檔案限制*/
    r_limit.rlim_cur = 2048;
    r_limit.rlim_max = 4096;

    printf("seeting a 2k file zise limit\n");
    setrlimit(RLIMIT_FSIZE, &r_limit);

    work();

    return 0;
}

>>歡迎前往Superfunction C Language

沒有留言:

張貼留言