Windows 进程的一生

本文介绍了一个C++程序,该程序能够创建自身进程的克隆,并为每个克隆分配一个唯一的ID。通过调用Windows API函数实现,展示了如何使用CreateProcess创建具有独立控制台的新进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#  include<iostream.h>
#  include<windows.h>
#  include<stdio.h>
//创建进程的克隆并赋予其ID值
void  StartClone(int nCloneID)
{
    //获取当前文件名
    TCHAR  szFilename[MAX_PATH];
    ::GetModuleFileName(NULL,szFilename,MAX_PATH);
    //得到用于子进程的命令行,并将文件名和ID通知子进程
    TCHAR szCmdLine[MAX_PATH];
    ::sprintf(szCmdLine,"/"%s/"%d",szFilename,nCloneID);
    //用于子进程的STARTUPINFO结构
    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);
    }
}
int main(int argc,  char*  argv[])
{
    //确定进程在列表中的位置
    int nClone(0);
    if(argc>1)
    {
        //从第二个参数中提取克隆ID
        ::scanf(argv[1],"%d",&nClone);
    }
    //显示进程位置
    cout<<"Process ID:"<<::GetCurrentProcessId()
        <<",Clone ID:"<<nClone
        <<endl;
    //检查是否有创建子进程的需要
    const  int c_nCloneMax=5;
    if(nClone<c_nCloneMax)
    {
        //发送新进程的命令行和克隆号
        StartClone(++nClone);
    }
    //在终止之前暂停一下(1/2秒)
    ::Sleep(500);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值