windows下想要创建一个子进程不如linux的fork函数来得方便,通过CreateProcess函数创建一个新的进程,函数的定义如下
BOOL CreateProcess( LPCTSTR lpApplicationName, // 应用程序名称 LPTSTR lpCommandLine, // 命令行字符串 LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性 LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性 BOOL bInheritHandles, // 是否继承父进程的属性 DWORD dwCreationFlags, // 创建标志 LPVOID lpEnvironment, // 指向新的环境块的指针 LPCTSTR lpCurrentDirectory, // 指向当前目录名的指针 LPSTARTUPINFO lpStartupInfo, // 传递给新进程的信息 LPPROCESS_INFORMATION lpProcessInformation // 新进程返回的信息 );
下面写一个创建进程和简单的控制示例,首先创建一个小程序,作为子进程的实体
#include<iostream> #include<Windows.h> using namespace std; int main(int argc, char *argv[]) { cout << "args_num: " << argc << endl; for(int i = 0;i < argc;i ++){ cout << "arg " << i << " = " << argv[i] << endl; } return 0; }主要是打印进程的传入参数列表,下面是创建子进程的代码,运行后可以看到,子进程也能获取到传入参数了。
#include<iostream> #include<Windows.h> using namespace std; int main() { char cWindowsDirectory[MAX_PATH]; //LPTSTR 与 wchar_t* 等价(Unicode环境下) LPTSTR cWinDir = new TCHAR[MAX_PATH]; GetCurrentDirectory(MAX_PATH, cWinDir); LPTSTR sConLin = wcscat(cWinDir , L"\\..\\Debug\\another.exe a b c d"); STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); //创建一个新进程 if(CreateProcess( NULL, // 指向一个NULL结尾的、用来指定可执行模块的宽字节字符串 sConLin, // 命令行字符串 NULL, // 指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。 NULL, // 如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。<同上> false,// 指示新进程是否从调用进程处继承了句柄。 0, // 指定附加的、用来控制优先类和进程的创建的标 // CREATE_NEW_CONSOLE 新控制台打开子进程 // CREATE_SUSPENDED 子进程创建后挂起,直到调用ResumeThread函数 NULL, // 指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境 NULL, // 指定子进程的工作路径 &si, // 决定新进程的主窗体如何显示的STARTUPINFO结构体 &pi // 接收新进程的识别信息的PROCESS_INFORMATION结构体 )) { cout << "create process success" << endl; //下面两行关闭句柄,解除本进程和新进程的关系,不然有可能不小心调用TerminateProcess函数关掉子进程 // CloseHandle(pi.hProcess); // CloseHandle(pi.hThread); } else{ cerr << "failed to create process" << endl; } Sleep(100); //终止子进程 TerminateProcess(pi.hProcess, 300); //终止本进程,状态码 ExitProcess(1001); return 0; }
CreateProcess的参数虽然多而且麻烦,其实大部分设置为NULL即可,右边这个链接里面有多进程编程相关的函数介绍:http://blog.csdn.net/bxhj3014/article/details/2082255