操作系统实验一

建立父进程,编写代码创建子进程,子进程的功能是克隆父进程,子进程每个0.5秒创建一次,创建25次,根据编写的源代码进行程序调试;

// proccreate项目
#include <windows.h>
#include <iostream>
#include <stdio.h>

//
void StartClone(int nCloneID)
{
    //  提取当前可执行文件的文件名
    TCHAR szFilename[MAX_PATH] ;
    :: GetModuleFileName(NULL, szFilename, MAX_PATH) ;

    // 格式化用于子进程的命令行,字符串“child”将作为形参传递给子进程的 main 函数
    TCHAR szCmdLine[MAX_PATH];
	:: sprintf(szCmdLine,"\"%s\" %d",szFilename,nCloneID);
    //将下句中的字符串 child 改为别的字符串,重新编译执行,执行前请先保存已经完成的工作
	// 子进程的启动信息结构
    STARTUPINFO si;
    :: ZeroMemory(reinterpret_cast <void*> (&si) , sizeof(si) ) ;
    si.cb = sizeof(si) ;				// 必须是本结构的大小

    // 返回的用于子进程的进程信息
    PROCESS_INFORMATION pi;

    // 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质
    BOOL bCreateOK=::CreateProcess(
        szFilename,					// 产生这个EXE的应用程序的名称
        szCmdLine,					// 告诉其行为像一个子进程的标志
        NULL,						// 缺省的进程安全性
        NULL,						// 缺省的线程安全性
        FALSE,						// 不继承句柄
        CREATE_NEW_CONSOLE,			// 使用新的控制台
        NULL,						// 新的环境
        NULL,						// 当前目录
        &si,						// 启动信息
        &pi) ;						// 返回的进程信息

    // 释放指向子进程的引用
    if (bCreateOK)
    {
        :: CloseHandle(pi.hProcess) ;//结束进程
        :: CloseHandle(pi.hThread) ;//
    }
    //CloseHandle();之后,切断了子进程和父进程之间的关系,子进程可以独立的运行。
    //TerminateProcess(hProcess) 强制性的终结一个进程。最好不用。
}

int main(int argc, char* argv[] )
{
    //
    int nClone(0);//定义nClone并初始化为0
    if (argc > 1)
    {
        //
        :: sscanf(argv[1] , "%d" , &nClone) ;
    }
    //arc 用来表示在命令行下输入命令的时候,一共有多少个参数。比方说程序编译后,可执行文件是test.exe
    //D:\tc2>test
    //此时argc的值是1
    //D:\tc2>test.exe myarg1 myarg2
    //此时argc的值是3。也就是 命令名 加上两个参数,一共三个参数
    //char *argv[] 用来取得所输入的参数
    //D:\tc2>test
    //此时argc的值是1,argv[0]的值是 “test”
    //D:\tc2>test myarg1 myarg2
    //此时argc的值是3,argc[0]的值是”test”,argc[1]的值是”myarg1”,argc[2]的值是”myarg2”

    // 显示进程位置
    std :: cout << "Process ID:" << :: GetCurrentProcessId()
                << ", Clone ID:" << nClone
                << std :: endl;

    // 定义子进程的最大个数
    const int c_nCloneMax=25;
    if (nClone < c_nCloneMax)
    {
        // 创建子进程
        StartClone(++nClone) ;
    }

    // 在终止之前暂停一下 (l/2秒)
    :: Sleep(500) ;

    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值