一、实验目的
设计并实现Unix 的“time” 命令。“mytime” 命令通过命令行参数接受要运行的程序,创建一个独立的进程来运行该程序,并记录程序运行的时间。
二、实验内容
在Windows 下实现: 
  • 使用CreateProcess()来创建进程
  • 使用WaitForSingleObject()在“mytime”命令和新创建的进程之间同步
  • 调用GetSystemTime()来获取时间
在Linux下实现: 
  • 使用fork()/execv()来创建进程运行程序
  • 使用wait()等待新创建的进程结束
  • 调用gettimeofday()来获取时间
 
三、实验环境
windows 7和ubuntu 10.10
四、程序设计与实现
      主要API函数说明:
windows:
BOOL CreateProcess
  (
   LPCTSTR lpApplicationName,
   LPTSTR lpCommandLine,
   LPSECURITY_ATTRIBUTES lpProcessAttributes。
   LPSECURITY_ATTRIBUTES lpThreadAttributes,
   BOOL bInheritHandles,
   DWORD dwCreationFlags,
   LPVOID lpEnvironment,
   LPCTSTR lpCurrentDirectory,
   LPSTARTUPINFO lpStartupInfo,
   LPPROCESS_INFORMATION lpProcessInformation
);
DWORD WaitForSingleObject(
   HANDLE hHandle,
   DWORD dwMilliseconds
);
linux:
int execv(char *pathname, char *argv[]);
这次实验不论是linux还是windows,主要思路只有一个利用fork或者createprocess建立一个子进程,在建立成功之后记录运行时间,然后利用wait或者waitforsingleobject函数等待子进程的同步,之后再记录运行时间,用两次时间相减即可。

    这里值得说明的是,要求中windows下的计时函数GetSystemTime()不太好用了,函数返回的是系统的时间,我们要用两次时间相减,这里还要考虑到有负数的情况,所以还要考虑借位,其实windows下面有一个好用的函数clock(),这个函数对于计时很在行。

 

window:

   
   
   
   
  1. #include   
  2. #include  
  3. using namespace std;  
  4. int main(int argc,char **argv)  
  5. {  
  6.     int year,month,day,hour,minutes,seconds,milliseconds;  
  7.     SYSTEMTIME start,end;  
  8.     STARTUPINFO si; //一些必备参数设置  
  9.     memset(&si, 0, sizeof(STARTUPINFO));  
  10.     si.cb = sizeof(STARTUPINFO);  
  11.     si.dwFlags = STARTF_USESHOWWINDOW;  
  12.     si.wShowWindow = SW_SHOW;  
  13.     PROCESS_INFORMATION pi; //必备参数设置结束  
  14.     if(!CreateProcess(argv[1],NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))  
  15.     {  
  16.         cout<<"Create Fail!"<
  17.         exit(1);  
  18.     }  
  19.     else 
  20.     {  
  21.         GetSystemTime(&start);  
  22.         cout<<"Success!"<
  23.     }  
  24.     WaitForSingleObject(pi.hProcess,INFINITE);  
  25.     GetSystemTime(&end);  
  26.     milliseconds=end.wMilliseconds-start.wMilliseconds;  
  27.     seconds=end.wSecond-start.wSecond;  
  28.     minutes=end.wMinute-start.wMinute;  
  29.     hour=end.wHour-start.wHour;  
  30.     day=end.wDay-start.wDay;  
  31.     month=end.wMonth-start.wMonth;  
  32.     year=end.wYear-start.wYear;  
  33.     if ( milliseconds < 0)  
  34.     {  
  35.         seconds--;  
  36.         milliseconds+=1000;  
  37.     }  
  38.     if ( seconds < 0 )  
  39.     {  
  40.         minutes--;  
  41.         seconds+=60;  
  42.     }  
  43.     if ( hour < 0 )  
  44.     {  
  45.         day--;  
  46.         hour+=24;  
  47.     }  
  48.     if ( day < 0 )  
  49.     {  
  50.         month--;  
  51.         day+=30;  
  52.     }  
  53.     if ( month < 0 )  
  54.     {  
  55.         year--;  
  56.         month+=12;  
  57.     }  
  58.     if ( year > 0 )  
  59.     {  
  60.         printf("%d天",year);  
  61.     }  
  62.     if ( month > 0 )  
  63.     {  
  64.         printf("%d月",month);  
  65.     }  
  66.     if ( day > 0 )  
  67.     {  
  68.         printf("%d天",day);  
  69.     }  
  70.     if ( hour > 0 )  
  71.     {  
  72.         printf("%d小时",hour);  
  73.     }  
  74.     if ( minutes > 0 )  
  75.     {  
  76.         printf("%d分钟",minutes);  
  77.     }  
  78.     if ( seconds > 0 )  
  79.     {  
  80.         printf("%d秒",seconds);  
  81.     }  
  82.     if ( milliseconds > 0 )  
  83.     {  
  84.         printf("%d微秒",milliseconds);  
  85.     }  
  86.     printf("\n");  
  87.     return 0;  

linux:

   
   
   
   
  1. #include   
  2. #include   
  3. #include   
  4.  
  5. int main(int argc,int **argv)  
  6. {  
  7.     int i;  
  8.     struct timeval start;  
  9.     struct timeval end;  
  10.     double timeuse;  
  11.     char *exec_argv[4];  
  12.     if (argc==1)  
  13.     {  
  14.         printf("Error!\n");  
  15.         exit(0);  
  16.     }  
  17.     if (fork()==0)  
  18.     {  
  19.         for (i=0; i
  20.         {  
  21.             exec_argv[i]=argv[i+1];  
  22.             printf("[%d]:%s\n", i,exec_argv[i]);  
  23.         }  
  24.  
  25.         printf("Child Create\n");  
  26.         execv(argv[1],exec_argv);  
  27.     }  
  28.     else 
  29.     {  
  30.         gettimeofday( &start, NULL );  
  31.         wait(NULL);  
  32.         gettimeofday( &end, NULL );  
  33.         timeuse = (1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec)/1000000;  
  34.         printf("time:%lfs\n",timeuse);  
  35.     }  
  36.     return 0;  
  37. }