//part2
#include
static void sighandle(int); static long realsecond = 0; static long vtsecond = 0;
static long profsecond = 0;
static struct itimerval realt,virtt,proft; int main(){
struct itimerval v; int i,j;
long moresec,moremsec,t1,t2; signal(SIGALRM,sighandle); signal(SIGVTALRM,sighandle); signal(SIGPROF,sighandle); v.it_interval.tv_sec = 10; v.it_interval.tv_usec = 0; v.it_value.tv_sec = 10; v.it_value.tv_usec = 0;
setitimer(ITIMER_REAL,&v,NULL); setitimer(ITIMER_VIRTUAL,&v,NULL);
setitimer(ITIMER_PROF,&v,NULL); for(j= 0;j<1000;j++){
for(i= 0;i<500;i++){printf(\ } getitimer(ITIMER_PROF,&proft);
getitimer(ITIMER_REAL,&realt); getitimer(ITIMER_VIRTUAL,&virtt); printf(\
moresec = 10 - realt.it_value.tv_sec;
moremsec = (1000000 - realt.it_value.tv_usec)/1000;
printf(\
moresec = 10 - proft.it_value.tv_sec;
moremsec = (1000000 - proft.it_value.tv_usec)/1000;
printf(\
moresec = 10 - virtt.it_value.tv_sec;
moremsec = (1000000 - virtt.it_value.tv_usec)/1000;
printf(\
t1 = (10 - proft.it_value.tv_sec)*1000 + (1000000 - proft.it_value.tv_usec)/1000 + profsecond*10000; t2 = (10 - virtt.it_value.tv_sec)*1000 + (1000000 - virtt.it_value.tv_usec)/1000 + vtsecond*10000; }
static void sighandle(int s) { }
switch(s){ case SIGALRM:realsecond+=10;break; case SIGVTALRM:vtsecond+=10;break; case SIGPROF:profsecond+=10;break;
default :break; }
moresec = (t1 - t2)/1000; moremsec = (t1 - t2) % 1000;
printf(\fflush(stdout);
C、编写一个主程序产生两个子进程,分别低轨计算N =20,30,36的Fibonacci序列。分
别对三个进程计算相应的real time, cpu time,user time ,kernel time。 设计思路:
与(2)原理基本相同,不同的只是在任务开始前要分别设定好每个进程的定时器,而且其最终的实验结果也由相应进程自身打印出来。
C.3、shell程序源代码清单
/**************part3.c***************/ //part3
#include
#include
static void c1_sighandle(int s); static void c2_sighandle(int s); static void p_sighandle(int s);
static long p_realt_secs = 0,c1_realt_secs = 0,c2_realt_secs = 0; static long p_virtt_secs = 0,c1_virtt_secs = 0,c2_virtt_secs = 0; static long p_proft_secs = 0,c1_proft_secs = 0,c2_proft_secs = 0; static struct itimerval p_realt,c1_realt,c2_realt; static struct itimerval p_virtt,c1_virtt,c2_virtt; static struct itimerval p_proft,c1_proft,c2_proft; static struct itimerval ini_value;
int main(){ int fib = 0; int pid1,pid2; int status;
long moresec,moremsec,t1,t2; pid1 = fork();
if (pid1 == 0){//c1 //set c1 signal handle c);
moresec = 10 - c1_virtt.it_value.tv_sec;
moremsec = (1000000 - c1_virtt.it_value.tv_usec)/1000;
printf(\
moresec = 10 - c1_proft.it_value.tv_sec;
moremsec = (1000000 - c1_proft.it_value.tv_usec)/1000;
printf(\
signal(SIGALRM,c1_sighandle); signal(SIGVTALRM,c1_sighandle); signal(SIGPROF,c1_sighandle); ini_value.it_interval.tv_sec = 10; ini_value.it_interval.tv_usec = 0; ini_value.it_value.tv_sec = 10; ini_value.it_value.tv_usec = 0; //set c1 timer
setitimer(ITIMER_REAL,&ini_value,NULL); setitimer(ITIMER_VIRTUAL,&ini_value,NULL); setitimer(ITIMER_PROF,&ini_value,NULL); fib = fibonacci(20);
//get timer of c1 and print
getitimer(ITIMER_REAL,&c1_realt); getitimer(ITIMER_VIRTUAL,&c1_virtt); getitimer(ITIMER_PROF,&c1_proft); printf(\
moresec = 10 - c1_realt.it_value.tv_sec;
moremsec = (1000000 - c1_realt.it_value.tv_usec)/1000;
printf(\
t1=(10-c1_proft.it_value.tv_sec)*1000+(1000000-c1_proft.it_value.tv_usec)/1000 +
c1_proft_secs*10000; t2=(10-c1_virtt.it_value.tv_sec)*1000+(1000000-c1_virtt.it_value.tv_usec)/1000 + c1_virtt_secs*10000; moresec = (t1 - t2)/1000;
moremsec = (t1 - t2) % 1000;
printf(\fflush(stdout); exit(0);
}//end c1
else{
pid2 = fork();
if (pid2 == 0){//c2 //set c2 signal handle
signal(SIGALRM,c2_sighandle); signal(SIGVTALRM,c2_sighandle); signal(SIGPROF,c2_sighandle); ini_value.it_interval.tv_sec = 10; ini_value.it_interval.tv_usec = 0; ini_value.it_value.tv_sec =10; ini_value.it_value.tv_usec = 0;
//set c2 timer
setitimer(ITIMER_REAL,&ini_value,NULL); setitimer(ITIMER_VIRTUAL,&ini_value,NULL); setitimer(ITIMER_PROF,&ini_value,NULL); fib = fibonacci(30);
//get timer of c2 and print
getitimer(ITIMER_PROF,&c2_proft); getitimer(ITIMER_REAL,&c2_realt); getitimer(ITIMER_VIRTUAL,&c2_virtt); printf(\
moresec = 10 - c2_realt.it_value.tv_sec;
moremsec = (1000000 - c2_realt.it_value.tv_usec)/1000;
printf(\emsec);
moresec = 10 - c2_proft.it_value.tv_sec;
moremsec = (1000000 - c2_proft.it_value.tv_usec)/1000;
printf(\moresec = 10 - c2_virtt.it_value.tv_sec;
相关推荐: