//cpulimit.c /** * Simple program to limit the cpu usage of a process * * Author: Angelo Marletta (marlonx80@hotmail.com) */ #include #include #include #include #include #include #include #include //pid of the controlled process int pid; //SIGINT signal handler void quit(int sig) { //let the process continue if it's stopped kill(pid,SIGCONT); exit(0); } int main(int argc, char **argv) { if (argc!=3) { fprintf(stderr,"Usage: %s {pid} {max cpu percentage}\n",argv[0]); exit(1); } pid=atoi(argv[1]); int limit=atoi(argv[2]); if (limit>100) { fprintf(stderr,"limit must be in the range 0-100\n"); exit(1); } //if possible renice this process, so it has more responsiveness if (setpriority(PRIO_PROCESS,getpid(),-20)!=0) { printf("Warning: cannot renice.\nTo work better you should run this program as root.\n"); } signal(SIGINT,quit); //time quantum in microseconds int period=100000; struct timespec twork,tsleep; //time to work, and time to sleep twork.tv_sec=0; twork.tv_nsec=period*limit*10; tsleep.tv_sec=0; tsleep.tv_nsec=period*(100-limit)*10; while(1) { if (kill(pid,SIGSTOP)!=0) break; nanosleep(&tsleep,NULL); if (kill(pid,SIGCONT)!=0) break; nanosleep(&twork,NULL); } perror("kill()"); exit(1); } usage : gcc -o cpulimit cpulimit.c cpulimit {seti pid} {cpu limit}