操作系统实验一·创建进程

article/2025/10/29 3:38:18

创建进程

  • 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的程序
请添加图片描述


http://chatgpt.dhexx.cn/article/lN8esqJo.shtml

相关文章

操作系统实验

实验一 命令解释程序 实验内容 利用C语言编写一个微型命令解释程序minishell.c&#xff0c;该程序可接收并解释以下命令&#xff1a; (1) dir 列出当前目录 (2) cop file1 file2 拷贝文件 (3) era filename 删除文件 (4) disp string 显示字符串 (5) end 结束&#xff0c;退出…

操作系统实验报告

操作系统 一、实验一 通过 VMware 虚拟机软件安装 Linux二、实验目的三、实验内容&#xff08;实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码&#xff09;四、实验结果与分析五、小结与心得体会 一、实验二 Windows 进程管理二、实验目的三、实验内容&…

操作系统实验——银行家算法

文章目录 一、实验目的二、实验内容和要求三、实验原理算法实现 四、实验程序代码如下&#xff1a; 五、验证数据和运行结果运行结果截图 六、思考与分析附 一、实验目的 掌握银行家算法思想&#xff0c;并能编程实现。 二、实验内容和要求 1、在Linux环境下编译运行程序&am…

操作系统实验(进程调度)

操作系统实验&#xff08;进程调度&#xff09; 一、实验目的二、实验内容三、实验准备3.1优先权算法3.2时间片轮转调度算法 四、实验 一、实验目的 1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。 二、实验内容 2.1…

【MFC】CCriticalSection类在Release编译下调用Lock函数会报0xC0000008错误

【MFC】CCriticalSection类在Release编译下调用Lock函数会报错0xC0000008 问题描述方法一 CRITICAL_SECTION代替CCriticalSection方法二 使用WaitForSingleObject和ReleaseMutex()结语 问题描述 通过以下伪代码方式描述问题&#xff1a; 主对话框类内创建成员变量及结构体变量…

联合使用类CCriticalSection和类CSingleLock同步线程

&#xff08;1&#xff09;新建一个控制台工程SellTicketTest2&#xff0c;并在向导的“应用程序设置”中勾选“MFC”。 &#xff08;2&#xff09;打开SellTicketTest2.cpp&#xff0c;在开头中引入头文件。 #include "afxmt.h"&#xff08;3&#xff09;添加变量&…

单独使用CCriticalSection对象来同步线程

&#xff08;1&#xff09;新建一个控制台工程SellTicketTest&#xff0c;并在向导的“应用程序设置”中勾选“MFC”&#xff0c;因为CCriticalSection属于MFC类&#xff0c;如图所示。 &#xff08;2&#xff09;在SellTicketTest.cpp开头中引入头文件。 #include "afx…

linux查看java线程死锁_ccriticalsection 多线程 死锁_c++ 线程死锁_linux 线程 死锁

qq_407283393122018-12-10 一个很蠢的造成死锁的问题 wanglt3113172018-12-12 什么是死锁&#xff0c;死锁的原因&#xff0c;如何避免 apanying902019-01-09 c3p0连接死锁 Cain_1507662016-09-20 notify产生死锁的场景(备忘) liuchuanyangyan9132017-02-23 C3P0配置错误导致的…

MFC线程同步—— CCriticalSection类使用

多个线程访问临界区时&#xff0c;可以使用临界区对象。临界区对象是一个独占性共享资源&#xff0c;任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段&#xff0c;其他希望进入临界区的线程将被挂起等待&#xff0c;直到拥有临界区的线…

CCriticalSection与CSingleLock

CCriticalSection An object of class CCriticalSection represents a “critical section” — a synchronization object that allows one thread at a time to access a resource or section of code. Critical sections are useful when only one thread at a time can be …

关键部分CCriticalSection使用

类CCriticalSection的对象表示一个“临界区”&#xff0c;它是一个用于同步的对象&#xff0c;同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如&#xff0c;在链表中添加一个结点就仅仅同意一次一个线程进行…

模拟售票大厅实例——多线程时访问共享变量时的安全(CMutex或CCriticalSection的应用)

当程序运行时&#xff0c;可以通过多线程来提高程序运行的效率和拥有更好的体验。但多线程&#xff08;或多进程&#xff09;同时也带来很多的问题&#xff1a;最严重的莫过于对同一个对象或变量访问时&#xff0c;由于线程运行异步的原因&#xff0c;会造成程序运行出现无法控…

在MFC下面实际演示CCriticalSection 的使用

Q&#xff1a;CCriticalSection是什么&#xff1f; A&#xff1a;CCriticalSection是一种线程同步策略 或者说技术 或者方法 总之呢就是这么个意思。。。。 参考资料&#xff1a; http://blog.csdn.net/akof1314/article/details/5773076 http://www.cnblogs.com/hlxs/archi…

Android对话框总结(普通对话框,单选对话框,多选对话框,自定义对话框)

个人推荐: &#x1f4e2;&#x1f4e2;&#x1f4e2; 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下 "通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。点击跳转到教程。 一:AlterDialog对话框 二:普通对话框 运行效果…

Android对话框显示输入框

在弹出的对话框显示输入框有两种方法&#xff1a; 法一&#xff1a;新建一个布局&#xff0c;并在对话框中引用它。 法二&#xff1a;直接在Activity中定义Edit并在对话框中用getText方法得到输入信息。

Android对话框的使用

Android对话框的使用 对话框&#xff08;Dialog&#xff09;是Android系统在Activity或者其他组件运行过程中提供的一种提示机制。它可以帮助应用完成一些必要的提示功能&#xff0c;同时提供一些与用户交互的功能。 对话框分为很多种&#xff0c;下面将一一介绍…

android 自定义对话框

// 基础库 implementation com.github.goweii.AnyLayer:anylayer:2.5.0 // 通用弹窗&#xff08;依赖基础库&#xff09; implementation com.github.goweii.AnyLayer:anylayer-common:2.5.0 编写dialog_layout 布局 <?xml version"1.0" encoding"utf-8&qu…

Android对话框的使用总结

一&#xff0e;相关概念 一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能. Android API 支持下列类型的对话框对象: &#xff08;一&#x…

Android对话框控件读写,Android 对话框控件

对话框控件 一、概述 对话框是 UI 设计中常用的控件&#xff0c;在windows操作系统中&#xff0c;对话框可分为模式对话框和非模式对话框。 模式对话框在使用时&#xff0c;项目中其它UI是不允许操作的&#xff0c;如保存对文件话框 非模式对话框允许操作其它的 UI Android 的对…

Android对话框总结

一、什么是对话框&#xff1f; 一种次要窗口&#xff0c;包含按钮和各种选项&#xff0c;通过它们可以完成特定命令或任务。 查找和替换对话框 对话框与窗口有区别&#xff0c;它没有最大化按钮、没有最小化按钮、大都不能改变形状大小。&#xff08;“打开文件”对话框是可以改…