在Linux下创建子进程:
? ? pid_t pid;
? ? if(( pid = fork()) == -1 )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //创建子进程
? ? {
? ? ? ? exit(0);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //创建进程失败,退出程序
? ? } else if(pid == 0) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //子进程空间
? ? ? ? char *args[]={FileMonitor, "-fp", lmonitorList[num].lm_strDirectory,? NULL};
? ? ? ? if(execve(FileMonitor, args, NULL)< 0) {? ? ? ? ? ? ? ? ? ? ? ? //在子进程中调用FileMonitor进程
? ? ? ? ? printf("execve ./wisFileMonitor -fp %s failed in the child process!/n", lmonitorList[num].lm_strDirectory);
? ? ? ? ? ? CREATE_THREAD(StartMonitorThread, (THREAD_PARAM) num);
? ? ? ? }
? ? } else {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //父进程空间
? ? ? ? lmonitorList[num].lm_pid = pid;
? ? ? ? lmonitorList[num].lm_bstop=false;
? ? }
如果在创建子进程时,没有出现任何错误,fork函数将返回两次,一次在父进程中,另一次在子进程中。fork函数将新创建的子进程ID返回给父进程,并将0返回给子进程。
在Windows下创建子进程较常用到的API就是CreateProcess,可以通过以下的方式启动一个新进程:
? ? STARTUPINFO si = {0};? ? ? ? ? ?
? ? PROCESS_INFORMATION pi = {0};
? ? si.cb = sizeof(STARTUPINFO);? ? ? ? //结构体大小
? ? GetStartupInfo(&si);? ? ? ? ? ? ? ? ? ? ? //初始化结构
? ? si.wShowWindow = SW_HIDE;? ? ? ? //新进程不显示窗口
? ? si.dwFlags = STARTF_USESHOWWINDOW;? //令si.wShowWindow生效
? ? //关键步骤,CreateProcess函数参数意义请查阅MSDN
? ? if (!CreateProcess( NULL,? ? ? ? ? ? //可执行文件名,为NULL时,通过szCmdLine提供
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? szCmdLine,? ? //命令行参数
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL,? ? ? ? ? ? //指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL,? ? ? ? ? ? //指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果lpThreadAttributes参数为空(NULL),那么句柄不能被继承。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FALSE,? ? ? ? //指示新进程是否从调用进程处继承了句柄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL,? ? ? ? ? //指定附加的、用来控制优先类和进程的创建的标志
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL,? ? ? ? ? //指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL,? ? ? ? ? //子进程的工作路径,当进程名为相对路径时,必须填写
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &si,? ? ? ? ? //指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &pi))? ? ? ? ? //指向一个用来接收新进程信息的PROCESS_INFORMATION结构体
? ? {
? ? ? ? return false;
? ? }
? ? WaitForSingleObject(pi.hProcess,INFINITE);? //等待子进程结束
? ? CloseHandle(pi.hThread);? ? ? ? ? ? ? ? ? ? ? ? ? ? //关闭新进程的主线程
? ? CloseHandle(pi.hProcess);? ? ? ? ? ? ? ? ? ? ? ? ? ? //关闭新进程