创建进程

  • 1实验目的
  • 2实验内容:
    • 2.1Windows实现
    • 2.2Linux实现
  • 3实验环境
    • 3.1Windows
    • 3.2Linux虚拟机
  • 4程序设计和实现
    • 4.1Windows实现
      • 4.1.1函数解释
      • 4.1.2程序代码
      • 4.1.3运行结果
    • 4.2Linux实现
      • 4.2.1函数解释
      • 4.2.2程序代码
      • 4.2.3运行结果

Use system calls to implement a “mytime” command to run an executable program through the command line parameter. Create a new process to run this executable program and record the running time of that program. Implement a Windows version and a Linux version.

1实验目的

使用系统调用实现“mytime”命令,通过命令行参数运行可执行程序。创建一个新进程来运行此可执行程序,并记录该程序的运行时间。实现Windows版本和Linux版本。

2实验内容:

2.1Windows实现

•使用CreateProcess()创建新流程
•在“mytime”命令中使用WaitForSingleObject()与创建的进程同步。
•使用GetSystemTime()获取时间。

2.2Linux实现

•使用fork()/execv()创建新流程
•使用wait()等待创建的进程结束。
•使用gettimeofday()获取当前时间。

3实验环境

3.1Windows

操作系统:Windows 10
处理器:AMD 3800X

3.2Linux虚拟机

操作系统:Ubantu 20.04.3
虚拟机软件:VMware Workstation 15
虚拟处理器:1个6核

4程序设计和实现

4.1Windows实现

4.1.1函数解释

CreateProcess()函数创建进程并为进程指定运行程序。其语句调用如下:
BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles, DWORD dwCreationFlag,
LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMTION lpProcessInformation);
几个有用到的参数。
lpApplication:该参数指定新进程将使用的可执行文件
lpCommandLine:该参数指定里传递给新进程的命令行字符串,该函数将按照一定的顺序搜索该可执行文件位置,并执行
lpProcessInformation:该参数是只想包含返回的进程和线程的句柄、进程和线程标识符的指针。在等待同步函数中需要从该结构中调取句柄信息

我使用的是:
CreateProcess
(NULL, //不在此指定可执行文件的文件名
argv[1], //命令行参数
NULL, //默认进程安全性
NULL, //默认线程安全性
FALSE, //当前进程内的句柄不可以被子进程继承
CREATE_NEW_CONSOLE, //为新进程创建一个新的控制台窗口
NULL, //使用本进程的环境变量
NULL, //使用本进程的驱动器和目录
&si, //父进程传给子进程的一些信息
&pi //保存新进程信息的结构
)

WaitForSingleObject()进程等待同步函数使父进程等待子进程,函数描述如下:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
其中,参数hHandle为等待对象的句柄,实验中通过lpProcessInformation.hProcess给出,dwMillisenconds是以毫秒为单位的等待时间,由于本实验等待子进程完全结束,于是给定值为无限,即INFINITE。

typedef struct_PROCESS_INFORMATION
{  HANDLE hProcess;  
HANDLE hThread; 
 DWORD dwProcessId; 
 DWORD dwThreadId;  
}PROCESS_INFORMATION;  
其中成员含义如下。 
① hProcess:返回新进程的句柄。  
② hThread:返回主线程的句柄。 
③ dwProcessId:返回一个全局进程标识符。该标识符用于标识一个进程。从进程被  创建到终止,该值始终有效。 
④ dwThreadId:返回一个全局线程标识符。该标识符用于标识一个线程。从线程被创  建到终止,该值始终有效。

4.1.2程序代码

#include <iostream>
#include <windows.h>using namespace std;int main(int argc, char *argv[])
{STARTUPINFO si;//进程启动相关信息的结构体ZeroMemory(&si, sizeof(si));//初始化清空si.cb = sizeof(si);//应用程序必须将cb初始化为sizeof(STARTUPINFO)PROCESS_INFORMATION pi;//有关新进程及其主线程的信息ZeroMemory(&pi, sizeof(pi));//初始化清空SYSTEMTIME starttime;//记录开始的时间if (!CreateProcess(NULL, argv[1], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){cout << "create failed" << endl;return 0;}else{GetSystemTime(&starttime);cout << "start_time:" << starttime.wYear << "-" << starttime.wMonth << "-" << starttime.wDay << " ";cout << starttime.wHour << ":" << starttime.wMinute << ":" << starttime.wSecond << ":"<< starttime.wMilliseconds << endl;}WaitForSingleObject(pi.hProcess, INFINITE);//记录结束的时间SYSTEMTIME endtime;GetSystemTime(&endtime);cout << "end_time:" << endtime.wYear << "-" << endtime.wMonth << "-" << endtime.wDay << " ";cout << endtime.wHour << ":" << endtime.wMinute << ":" << endtime.wSecond << ":" << endtime.wMilliseconds<< endl;return 0;
}

4.1.3运行结果

通过运行自己写的另外一个简单程序来实现

#include <iostream>using namespace std;int main()
{cout << "Hello, World!" << endl;cout << "Name: Zhang Haojie" << endl;cout << "ID: 1120193583" << endl;return 0;
}

4.2Linux实现

4.2.1函数解释

使用fork()创建函数,正确完成时,函数返回给父进程的是被创建子进程的标识,返回给子进程的为0;若创建失败,则返回父进程的为-1;通过返回值,可以判断子进程是否创建成功,以及进程是子进程还是父进程。
pid_t fork(void);

使用execv()为子进程指定运行程序,其函数调用如下:
int execv(const char pathname,char const arg[]);

使用gettimeofday()进行计时,该函数获得从1970年1月1日到现在的时间
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval{
long int tv_sec; //记录秒数
long int tv_usec; //记录微秒数
}

4.2.2程序代码

#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/wait.h>using namespace std;int main(int argc, char *argv[])
{//打印输入的参数for (int i = 0; i < argc; i++){cout << "aug[" << i << "]:" << argv[i] << endl;}//获取开始时间timeval starttime, endtime;pid_t pid;//创建子进程pid = vfork();if (pid < 0){cout << "fork error" << endl;}else if (pid == 0){//子进程//获取运行的时间gettimeofday(&starttime, NULL);cout << "create child" << endl;cout << "start_time:" << starttime.tv_sec << ":" << starttime.tv_usec << endl;execv(argv[1], &argv[1]);}else{//父进程在等待子进程完成wait(NULL);gettimeofday(&endtime, NULL);cout << "end_time:" << endtime.tv_sec << ":" << endtime.tv_usec << endl;}return 0;
}

4.2.3运行结果

通过运行自己写的另外一个简单程序来实现,继续运行之前的那个Hello的程序

操作系统实验一·创建进程相关推荐

  1. Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc

    操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...

  2. 操作系统实验一:进程管理

    操作系统实验一:进程管理 一.实验目的: 通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建.执行.撤销). 二.实验要求及内容: 用C ...

  3. 操作系统实验三、进程通信

    文章目录 操作系统实验三.进程通信 一.实验目的 二.实验内容 三.设计原理(或方案)及相关算法 四.结果分析 五.源代码 操作系统实验三.进程通信 一.实验目的 ​ 1.了解和熟悉Linux支持的消 ...

  4. 广州大学2020操作系统实验一:进程管理与进程通信

    相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...

  5. Linux C : 进程管理实验:创建进程、上下文切换

    进程可以看成程序的执行过程,可以展示在当前时刻的执行状态.它是程序在一个数据集合上的一次动态执行的过程.这个数据集合通常包含存放可执行代码的代码段,存放初始化全局变量和初始化静态局部变量的数据段.用于 ...

  6. 操作系统实验3:进程运行轨迹的跟踪与统计

    参考 哈工大操作系统实验 B站UP主的视频讲解 Linux内核完全注释:基于0.11内核(修正版V3.0) https://www.cnblogs.com/wanghuizhao/p/16644919 ...

  7. linux系统进程调度算法实验,操作系统实验三、进程调度算法实验

    实验三.进程调度算法实验 3.1 实验目的 加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux 系统中进程 调度策略的使用方法.练习进程调度算法的编程和调试技术. 3.2 实验说明 在 ...

  8. 操作系统实验报告linux进程管理,计算机操作系统实验报告三Linux进程基本管理.doc...

    GDOU-B-11-112广东海洋大学学生实验报告书(学生用表) GDOU-B-11-112 实验名称 Linux进程基本管理 课程名称 计算机操作系统 课程号 学院(系) 专业 统 班级 学生姓名 ...

  9. exec函数介绍(整理)(附带:操作系统实验一:进程控制实验 代码)

    (1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...

最新文章

  1. Java 学习内容总结
  2. python跨进程共享内存
  3. 【C#】允许泛型方法T返回空值Null
  4. lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为一行...
  5. 美国第一台电子计算机是由女程序员编写的
  6. 定义咯一个枚举变量枚举变量怎么打印出来 linux c,以C语言的字符串形式输出枚举变量...
  7. java学习(30):巩固练习
  8. Uep的ajaxform和ajaxgrid组件获取数据源
  9. oracle报ora-08002,ORA-08002: 序列 SEQ_WGB_TEST2.CURRVAL 尚未在此会话中定义
  10. 从超大规模云服务提供商处学习效率
  11. 采集新闻数据的10个经典方法
  12. np.minimum()用法、广播机制
  13. 51单片机学习笔记——DA转换
  14. 淘宝模拟登录2解决滑动验证问题
  15. 聚类——K均值简介及Python实现
  16. 2021 年最佳 3D 渲染 GPU
  17. 027-Mac触摸板实现窗口移动
  18. C#WinForm应用程序——简易摇号系统
  19. SQL*Plus中 Set timing on的时间显示单位
  20. oracle 数据库 date + 1 转载

热门文章

  1. 那所谓的三巨头----三个和尚和那一场大火
  2. 机床遇到这种故障该怎么办?
  3. 今日的电脑小技巧分享
  4. python list分组操作--简便易读
  5. 十款优质企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)
  6. matlab练习程序(RGB2YCbCr、YCbCr2RGB)
  7. sts拷贝工作空间,不用重复配置
  8. HBASE 2.0 hbck使用
  9. RIP协议的综合实验
  10. 关于IBGP邻居创建的尝试