#include #include #include #include #include #include #include #include #define GOD_PRIORITY 100000 #define ONE_PRIORITY 500 #define TWO_PRIORITY 10 #define THREE_PRIORITY 105 #define FOUR_PRIORITY 75 void loop() { int i, j; for(i=0;i<10000;++i) for(j=0;j<100000;++j) {} } int main(int argc, char **argv) { pid_t pid, pid2, pid3, pid4; int i, j, time; char files[4][40]; FILE *in[4]; FILE *out; struct sched_param param; unsigned int begin; char line[1000]; int stime; param.sched_priority = 23; setgid(GOD_PRIORITY); sched_setscheduler( 0, 3, ¶m ); pid=pid2=pid3=-1; begin=clock(); setgid(ONE_PRIORITY); pid=fork(); if(pid>0) { setgid(TWO_PRIORITY); pid2=fork(); } if(pid2>0) { setgid(THREE_PRIORITY); pid3=fork(); } init: if(pid==0) { loop(); printf("1 FINISHED\n"); printf("Time elapsed(uS): %u\n",clock()-begin); exit(0); } else if(pid2==0) { loop(); printf("2 FINISHED\n"); printf("Time elapsed(uS): %u\n",clock()-begin); exit(0); } else if(pid3==0) { loop(); printf("3 FINISHED\n"); printf("Time elapsed(uS): %u\n",clock()-begin); exit(0); } else if(pid4==0) { loop(); printf("4 FINISHED\n"); printf("Time elapsed(uS): %u\n",clock()-begin); } else { setgid(GOD_PRIORITY); time=1; sprintf(files[0],"/proc/%d/stat",pid); sprintf(files[1],"/proc/%d/stat",pid2); sprintf(files[2],"/proc/%d/stat",pid3); out=fopen("RESULTS","w"); while(1) { fprintf(out,"%d\n",time); for(i=0;i<4;++i) { if((in[i]=fopen(files[i],"r"))) { fgets(line,1000,in[i]); strtok(line," \n"); for(j=0;j<12;++j) strtok(NULL," \n"); stime=atoi(strtok(NULL," \n")); fprintf(out,"%d) %d\n",i+1,(int)stime); fclose(in[i]); } else fprintf(out,"NOT RUNNING\n"); } time++; fprintf(out,"\n"); waitpid(-1, NULL, WNOHANG); if(kill(pid,0) == -1 && kill(pid2,0)==-1 && kill(pid3,0)==-1 && kill(pid4,0)==-1) break; //wait(NULL); //exit(1); usleep(1000000); if(time==5) { setgid(FOUR_PRIORITY); pid4=fork(); if(pid4==0) goto init; setgid(GOD_PRIORITY); sprintf(files[3],"/proc/%d/stat",pid4); } } fclose(out); exit(0); } }