0
点赞
收藏
分享

微信扫一扫

操作系统实验 Lab1 进程管理

小猪肥 2022-01-05 阅读 80

一、实验目的
“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;
}
举报

相关推荐

0 条评论