一、实验目的
“mytime”命令通过命令行参数接受要运行的程序,创建一个独立的进程来运行该程序,并记录程序运行的时间。
二、实验内容
在Windows 下实现:
- 使用CreateProcess()来创建进程
- 使用WaitForSingleObject()在“mytime”命令和新创建的进程之间同步
- 调用GetSystemTime()来获取时间
在Linux下实现:
- 使用fork()/execv()来创建进程运行程序
- 使用wait()等待新创建的进程结束
- 调用gettimeofday()来获取时间
三、实验内容
1、Windows版本
创建子进程之前调用系统函数GetSystemTime()获取当前系统时间。
调用CreateProcess()函数创建进程。
使用命令行的形式创建好进程后,调用等待函数来等待所创建函数的死亡,
等待函数为:WaitForSingleObject(pi.hProcess,INFINITE)。
当子进程死亡后,再次通过GetSystemTime()函数获得系统时间。
#include<iostream>
#include<Windows.h>
using namespace std;
int main(int argc, char* argv[])
{
SYSTEMTIME st;
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
if (!CreateProcess(NULL, argv[1], NULL, NULL, false, 0, NULL, NULL, &si, &pi))
{
cout << "Create fail" << endl;
exit(1);
}
else
{
GetSystemTime(&st);
cout << "开始时间:" << st.wMinute << ":" << st.wSecond << ":" << st.wMilliseconds << endl;
cout << "Create success" << endl;
}
WaitForSingleObject(pi.hProcess, INFINITE);
GetSystemTime(&st);
cout << "结束时间:" << st.wMinute << ":" << st.wSecond << ":" << st.wMilliseconds << endl;
}
2、Linux版本
用fork()函数创建进程,通过fork()函数返回值来判断是子进程还是父进程。
如果是子进程运行,则在子进程中调用execv()函数。在命令行中来运行一个程序,即execv(argv[1],&argv[1])。
如果是父进程在运行,则先获取系统时间,等待子进程运行结束,即wait(NULL),然后再次获取系统时间。
#include<stdio.h>
#include<unistd.h>
#include<sys/time.h>
#include <stdlib.h>
int main(int argc,char*argv[])
{
struct timeval tv;
pid_t pid;
pid=fork();
if(pid<0)
{
printf("Fork failed\n");
exit(0);
}
else if(pid==0)
{
printf("Create child\n");
execv(argv[1],&argv[1]);
}
else
{
gettimeofday(&tv,NULL);
printf("开始时间:%ld:%ld\n",tv.tv_sec,tv.tv_usec);
wait(NULL);
gettimeofday(&tv,NULL);
printf("结束时间:%ld:%ld\n",tv.tv_sec,tv.tv_usec);
}
return 0;
}