ulimit yapar gibi processin resource larını kısıtlayabilirsiniz. Bunun için getrlimit, setrlimit fonksiyonları ve rlimit structure ı vardır:
struct rlimit {
rlim_t rlim_cur; /* Soft limit */
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
Görüldüğü gibi, structure iki tane değer içeriyor. Bunlardan current limit olan, soft limit olarak da adlandırılır, diğeri maximum limit ise hard limit olarak adlandırılır. Current limitimizi, maximum limiti geçmeyecek şekilde ayarlarız.
Örnek olarak RLIMIT_CPU resource unu limitleyip etkisini görelim:
#include <sys/resource.h>
#include <sys/time.h>
int main ()
{
struct rlimit rl;
getrlimit(RLIMIT_CPU, &rl);
rl.rlim_cur = 1;
setrlimit(RLIMIT_CPU, &rl);
while (1);
return 0;
}
Şimdi derleyip çalıştıralım:
$ gcc limit-cpu.c -o limit-cpu
$ ./limit-cpu
CPU time limit exceeded
1 saniye olarak ayarladığımız cpu-time ı aşan process imiz
SIGXCPU sinyali aldı ve öldürüldü.
Bu sinyal handle edilebiliyor. Handle edip process imizi devam ettirirsek her saniyede bir bu sinyal alınmaya devam edilir ve hard limite ulaşıldığında
SIGKILL sinyali alınır. Ama bu durum değişen bir davranıştır linux un kendi farklı çekirdek versiyonlarında bile. Uygulamamızın portable olması için
SIGXCPU aldığımızda process ölmeli.