程序中用到 math.c,使用 gcc 編譯,需要加上 -lm 選項。
-l表示使用庫,m為數學庫。
=================
Linux程序設計中的一個例子:
#include <sys/types.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <math.h>
/// 向一個臨時文件寫一個字符串10000次,然后進行一些數學運算,目的是制造一些CPU負荷
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)){ //TODO ferror?
fprintf(stderr, "Error writing to temporary file\n");
exit(1);
}
}
for(i = 0; i < 1000000; i++)
x = log(x*x + 3.21);
}
/// main 函數先調用 work, 再調用 getrusage 函數查看它使用了多少 CPU 時間。把這些資料顯示在屏幕上。
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_utime 程序本身執行它的指令所消耗的時間
r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec); // r_usage.ru_stime OS由于這個程序而消耗的 CPU 時間
/// 調用 getpriority 和 getrlimit 函數分別查出自己的當前優先級和文件長度限制
priority = getpriority(PRIO_PROCESS, getpid()); // PRIO_PROCESS 表示后面是進程標識符
printf("Current priority = %d\n", priority);
getrlimit(RLIMIT_FSIZE, &r_limit); // 讀取以字節計的文件長度限制到 r_limit 中
printf("Current FSIZE limit: soft = %ld, hard = %ld\n",
r_limit.rlim_cur, r_limit.rlim_max); // rlim_cur 軟限制, rlimt_max 硬限制
/// 通過 setrlimit 函數設置了一個文件長度限制。
r_limit.rlim_cur = 2048; // 軟限制2M
r_limit.rlim_max = 4096; // 硬限制4M
printf("Setting a 2K file size limit\n");
setrlimit(RLIMIT_FSIZE, &r_limit);
/// 然后再次調用 work 失敗,因為它嘗試創建的文件尺寸過大。
work();
exit(0);
}
編譯:
[green@colorfulgreen environ]$ gcc limits.c -o limits
報錯:
/tmp/ccxW94yi.o: In function `work':
limits.c:(.text+0xaf): undefined reference to `log'
collect2: ld returned 1 exit status
編譯時加上 -lm 選項:
[green@colorfulgreen environ]$ gcc limits.c -lm -o limits
Done.
============
PS:為嘛這個編輯器插入代碼時最前面不能有下面這幾行T_T
/**
* 資源限制
**/