-
2019-10-28 20:39:59
有些时候,由于程序需要,我们会创建相同的进程实例运行在一台服务器上,通常,Windows使用CreateProcess创建子进程,Linux使用fork创建子进程。
创建子进程的函数定义
注:需要关注的参数,如下所示。
lpApplicationName:
The name of the module to be executed(可执行文件名,全路径)
lpCommandLine:
The command line to be executed.(命令行参数)
dwCreationFlags:
The flags that control the priority class and the creation of the process.(控制子进程的窗口存在形式)
lpProcessInformation:
A pointer to a PROCESS_INFORMATION structure that receives identification information about the new process.(存储子进程的进程句柄和线程句柄)
实例1:
/************************************************************************/ /* 父进程源码实现 */ /************************************************************************/ #include <Windows.h> #include <iostream> #define APPLICATION_NAME L"F:\\temp\\child_demo\\Debug\\child_demo.exe" int main(){ std::cout << "Welcome to run father process." << std::endl; // 设置新进程的窗口信息 STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); // 接收新进程的标识信息 PROCESS_INFORMATION pi; memset(&pi, 0, sizeof(pi)); // 创建子进程 BOOL ret = CreateProcess( APPLICATION_NAME, // 子进程名称(全路径,含扩展名) NULL, // 命令行参数 NULL, // 不继承父进程的进程句柄 NULL, // 不进程父进程的线程句柄 FALSE, // 句柄继承标识为FALSE // CREATE_NO_WINDOW -> 新进程,无窗口运行 // CREATE_NEW_CONSOLE -> 新进程,在独立控制台窗口运行。 CREATE_NEW_CONSOLE, NULL, // 使用父进程的环境 NULL, // 使用父进程的当前目录 &si, // 指向STARTUPINFO &pi); // 指向PROCESS_INFORMATION if(!ret){ std::cout << "create process fail!" << std::endl; return -1; } std::cout << "create process success!" << std::endl; // 等待子进程结束 WaitForSingleObject(pi.hProcess, INFINITE); std::cout << "child process finish" << std::endl; // 关闭子进程的进程句柄和线程句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); std::cout << "father process game over!" << std::endl; return 0; }
#include <iostream> #include <windows.h> using namespace std; int main(int argc, char* argv[]) { STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = TRUE; TCHAR cmdline[] =TEXT(" http://www.baidu.com/"); // 注意前面有空格,否则打开的是主页。 BOOL bRet = ::CreateProcess ( TEXT("c://program files//internet explorer//iexplore.exe"), cmdline, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); int nError = GetLastError(); if(bRet) { cout<<"进程的进程ID号:"<<pi.dwProcessId<<endl; cout<<"进程的主线程ID号:"<<pi.dwThreadId<<endl; ::CloseHandle (pi.hThread); ::CloseHandle (pi.hProcess); }else{cout<<"创建进程失败:"<nError<<endl; }return 0;}
更多相关内容 -
PHP多进程编程实例
2020-12-18 23:58:37想完成任务,又觉得一个进程太慢,那么,试试用多进程来搞吧。这篇文章将会介绍一下PHP多进程的基本需求,如何创建多进程以及基本的信号控制,暂时不会告诉你如何进行进程间通信和信息共享。 1. 准备 在动手之前,请... -
[学习记录] windows下多进程实例
2019-03-13 12:34:25Tag :实现多进程程序,同时调用多个项目中的可执行文件,让所有项目同步运行。 环境 :windows 下vs2010。 才看多进程,在网上找了几个函数就东拼西凑出来的,要是有什么地方不对的请指出。 下面这个图是...Tag :实现多进程程序,同时调用多个项目中的可执行文件,让所有项目同步运行。
环境 :windows 下vs2010。
才看多进程,在网上找了几个函数就东拼西凑出来的,要是有什么地方不对的请指出。
下面这个图是项目配置,exe_1 - exe_3是三个想要调用的项目,每个都是单进程的程序,Process中调用这三个项目让它们同时运行。
每个项目的主函数都是这个,测试用。Process\EXE_1\EXE_1.cpp
Process\EXE_2\EXE_2.cpp
Process\EXE_3\EXE_3.cpp
int _tmain(int argc, _TCHAR* argv[]) { int i = 0; while (1) { cout<<"EXE 2 !" << i <<endl; Sleep(1000); i++; } return 0; }
进程的创建和关闭Process\Process\main.cpp
#include <windows.h> #include <iostream> using namespace std; int main() { //一些必备参数设置 STARTUPINFO si; // 该结构用于指定新进程的主窗口特性 memset(&si,0,sizeof(STARTUPINFO)); //初始化si在内存块中的值(详见memset函数) si.cb=sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; PROCESS_INFORMATION pi[4]; // 进程相关信息(句柄,标识) //必备参数设置结束 // // 创建进程 int a; // 查看进程是否成功创建(调试用) a = CreateProcess(NULL, "EXE_1", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[0]); a = CreateProcess(NULL, "EXE_2.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[1]); a = CreateProcess(NULL, TEXT("EXE_3.exe"), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[2]); a = CreateProcess(NULL, TEXT("D:\\Program Files (x86)\\npp.6.5.4.bin\\notepad++.exe"), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[3]); // 打开notepad++ // // 终止线程 for (int i = 0; i < 4; i++) { OpenProcess(NULL, true, pi[i].dwProcessId); DWORD fuExitCode; // 进程的退出码 GetExitCodeProcess(pi[i].hProcess, &fuExitCode); // 获得进程的退出码 TerminateProcess(pi[i].hProcess, fuExitCode); // 终止进程 CloseHandle(pi[i].hThread); CloseHandle(pi[i].hProcess); } // return 0; }
暂时看到这~
-
php多进程应用场景实例详解
2021-01-02 19:17:46本文实例讲述了php多进程应用场景。分享给大家供大家参考,具体如下: pcntl介绍 扩展介绍 php多进程模块依赖pcntl扩展,官方手册介绍:http://php.net/manual/zh/book.pcntl.php Note: 1. 此扩展在 Windows 平台上... -
Windows多线程编程技术与实例(C++)(PDF)
2019-05-05 19:58:10Windows多线程编程技术与实例(C++),对于学西多线程的同学很不错的推荐,很棒的工具书 -
Windows下动态绑定进程的CPU亲和性的实例,内附实例,可以直接运行查看结果。
2019-12-24 11:39:40Windows下动态绑定进程的CPU亲和性的实例,内附实例,可以直接运行查看结果。在Win10系统中亲测有效。 -
windows启动单个进程实例(系统中只有一个运行实例)
2021-12-01 22:34:23但是有时候哦我们只需要一个进程实例,那我们该怎么办呢?一个进程实例具体是什么时候啊?来看一下Windows的任务管理器: 还有我们平时用的PC版那个绿色的社交软件,只要登录一个账号之后,你每次启动进程,你都会...大家好,我是KookNut39,在CSDN写文,分享一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。感兴趣的欢迎关注博主,可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。
我们写的程序一般都是可以多次运行的,就比如我随便打开的这个程序,我们一直双击,它会一直启动:
但是有时候哦我们只需要一个进程实例,那我们该怎么办呢?一个进程实例具体是什么时候啊?来看一下Windows的任务管理器:
还有我们平时用的PC版那个绿色的社交软件,只要登录一个账号之后,你每次启动进程,你都会发现打开的是已经登录的那个页面,也就是无法同时登录两个账号(ps: 特殊方法除外)。那我们自己写的程序要做到这一点,是否有难度呢?其实是比较简单的,只需要你对windows编程有一些基础的了解即可。接下啦手把手带大家写一个程序,只能启动一个实例,先说一下环境,我是拿vs写的,默认编码是UNICODE字符集,如果照着我的代码写,编译报错,可以看看字符集的问题:
我们拿简单的console程序距离,主要是说一下用法,首先我们来创建一个GUID,GUID的创建可以使用vs自带的工具,也可以自己网上去查找其它的创建方法,GUID是唯一身份标识码,就和我们身份证ID一样,唯一的。
#include<iostream> #include<windows.h> int main(int argc, LPWSTR* argv) { //创建一个互斥体,带有GUID的,如果成功,则返回有效句柄值 GUID是我们通过vs刚生成的 HANDLE mutexHandle = CreateMutexW(NULL, FALSE, L"Global\\{66451FDE-56B1-406A-9810-D6B372BAE28E}"); if (ERROR_ALREADY_EXISTS == GetLastError()) { if (mutexHandle) { CloseHandle(mutexHandle); } MessageBox(NULL, "exist", "single", NULL); goto exit; } std::cout << "starting" << std::endl; exit: return 0; }
最后的运行效果如下图所示:
好久不见,今天来完成下任务,感觉CSDN好久没更新了,今天简单的过来搞得小demo,和大家玩一玩,如果有人以为我要放大招,那可大错特错了奥!!!
大家可以尝试在这个基础之上改一下这个demo,让它变成,如果程序已经运行就把程序重新加载起来(类似刷新的效果),就好像,打开任务管理器一样的效果,祝大家修改顺利!其中虽然代码少,但是涉及到windows开发的两个重要基础知识,句柄和互斥体对象,如果大家想了解,那我就后期更新一下这两个小知识点。
“你可以憧憬未来,但不要深陷其中,过好眼前的每一天足矣”
晚安,xdm -
两个多进程实例
2018-03-10 19:36:21由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序?由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。multiprocessing模块提供...multiprocessing
如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有
fork
调用,难道在Windows上无法用Python编写多进程的程序?由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。
multiprocessing
模块就是跨平台版本的多进程模块。multiprocessing
模块提供了一个Process
类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print('Run child process %s (%s)...' % (name, os.getpid())) if __name__=='__main__': print('Parent process %s.' % os.getpid()) p = Process(target=run_proc, args=('test',)) print('Child process will start.') p.start() p.join() print('Child process end.')
创建子进程时,只需要传入一个执行函数和函数的参数,创建一个
Process
实例,用start()
方法启动,这样创建进程比fork()
还要简单。join()
方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。Pool
如果要启动大量的子进程,可以用进程池的方式批量创建子进程:
from multiprocessing import Pool import os, time, random def long_time_task(name): print('Run task %s (%s)...' % (name, os.getpid())) start = time.time() time.sleep(random.random() * 3) end = time.time() print('Task %s runs %0.2f seconds.' % (name, (end - start))) if __name__=='__main__': print('Parent process %s.' % os.getpid()) p = Pool(4) for i in range(5): p.apply_async(long_time_task, args=(i,)) print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done.')
进程间的通信
父进程可以指定子进程执行的方法及其参数, 达到父进程向子进程传递消息的单向通信的目的, 那子进程之间或子进程怎么向父进程通信呢
Queue
Queue 是一种方式
12345678910111213141516171819202122232425from multiprocessing import Process , Queueimport os , timedef write_queue ( q ) :for name in [ "Yi_Zhi_Yu" , "Tony" , "San" ] :print "put name %s to queue" % ( name )q . put ( name )time . sleep ( 2 )print "write data finished"def read_queue ( q ) :print "begin to read data"while True :name = q . get ( )print "get name %s from queue" % ( name )if __name__ == "__main__" :q = Queue ( )pw = Process ( target = write_queue , args = ( q , ) )pr = Process ( target = read_queue , args = ( q , ) )pw . start ( )pr . start ( )pw . join ( ) #这个表示是否阻塞方式启动进程, 如果要立即读取的话, 两个进程的启动就应该是非阻塞式的, 所以pw在start后不能立即使用pw.join(), 要等pr start后方可pr . terminate ( ) #服务进程,强制停止进程交互
典型的场景就是,父进程内开启一个子进程,并获取子进程的执行的返回结果。
这个时候,就需要指定stdin, stdout为PIPE形式了。否则的话,两个进程之间是无法进行交流的。这就好比两个池塘,相互有自己的资源,如果内有一个通道的话,两个池塘就没办法”交流“。
1.py
import sys s = "this is from {}".format(__file__) sys.stdout.write(s)
- 1
- 2
- 3
- 4
- 5
2.py
import subprocess import sys try: child = subprocess.Popen('python ./1.py', stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE) print child.stdout.readline() except Exception as e: print e
-
Windows多线程编程技术与实例.pdf
2014-05-26 11:56:58Windows多线程编程技术与实例 图书描述: 本书通过众多实例介绍了如何实现Windows下的多线程编程,既重点介绍了Win32API下的多线程编程和MFC下的多线程编程,又介绍了多线程机制在网络编程、图形编程和数据库中的... -
利用C#编写Linux守护进程实例代码
2020-12-25 22:20:07Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多进程,父子进程文件描述... -
win32下进程间通信(共享内存)实例分析
2021-01-01 06:24:40很多情况下在Windows程序中,各个进程之间往往需要交换数据,进行数据通讯。WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换。 进程间通讯(即:同机... -
python在windows下创建隐藏窗口子进程的方法
2020-12-24 08:42:52本文实例讲述了python在windows下创建隐藏窗口子进程的方法。分享给大家供大家参考。具体实现方法如下: import subprocess IS_WIN32 = 'win32' in str(sys.platform).lower() def subprocess_call(*args, **kwargs... -
《Windows多线程编程技术与实例》-郝文化-书和源码
2014-12-20 15:16:57第2~5章通过实例阐明Win32下多线程的几种不同实现形式及多进程的实现机制,这是本书介绍的重点内容,也是读者学习后面几章内容所必须掌握的基础知识;第6~8章介绍了多线程技术在网络、图形处理和数据库中的应用。 ... -
Windows C++ 多线程编程示例
2022-04-26 09:22:27/* 题目:主线程创建两个辅助...开发工具:DEV windows平台 语言:C++ */ #include <windows.h> #include <iostream> using namespace std; #define MAX 100 //数组空间最大值 int array[MAX]; //待排 -
windows守护进程
2021-01-12 17:04:031、windows没有fork函数,无法创建僵尸进程,使用打开非子进程的方式打开外部进程---打开外部进程 2、守护进程应该是单例的进程---》单例进程 3、守护进程应该是存在一个子线程不断的判断是否存在守护目标,若不... -
VC++多线程管理实例
2021-03-15 17:40:33内容索引:VC/C++源码,系统相关,多线程 一个基于VC++的多线程管理程序,测试程序中一共有两个进程,可以演示让两个进程同进工作,同进关闭,也可以一个一个工作,分开进行,本程序就是一个进程控制开关,用于启动、... -
Windows下C++多线程编程(入门实例)
2018-08-28 18:44:09多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面...),但Windows系统为我们提供了相关API,我们可以使用他们来进行多线程编程。 创建线... -
python执行子进程实现进程间通信的方法
2020-12-23 21:56:54本文实例讲述了python执行子进程实现进程间通信的方法。分享给大家供大家参考。具体实现方法如下: a.py: import subprocess, time subproc = subprocess.Popen(['c:\python31\python.exe', 'c:/b.py'], stdin=... -
Qt之进程间通信之Windows消息nativeEvent.rar
2020-12-18 11:17:511.QQ:513187410 2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.需要更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用! -
MySQL数据库入门之多实例配置方法详解
2021-01-19 21:47:12多实例就是一台服务器上开启多个不同的服务端口(默认3306),运行多个mysql的服务进程,这此服务进程通过不同的socket监听不同的服务端口来提供各在的服务,所有实例之间共同使用一套MYSQL的安装程序,但各自使用... -
精通Windows.API-函数、接口、编程实例.pdf
2013-01-27 11:49:552.1.3 Windows数据类型与Windows API 14 2.1.4 Windows中的数据结构 15 2.2 Windows API的功能分类 15 2.2.1 系统基本服务 15 2.2.2 系统管理 17 2.2.3 用户界面 17 2.2.4 图像和多媒体 20 2.2.5 ... -
windows下python多进程multiprocessing报错TypeError: can't pickle _thread.lock objects
2019-08-09 12:46:20pickle用法,以及在multiprocessing中的雷区 Process传参报错pickle...我在开启多进程传参过程中传递了不可序列化的对象——ssh初始化的对象,他是一个Paramiko实例对象, 导致报错TypeError: can't pickle _threa... -
VC Windows系统控制编程实例集.rar
2019-07-10 18:56:54VC Windows系统控制编程实例集(源码),比如获得和设置NetBIOS计算机名、打开我的电脑,打开我的文档、注销、关闭、重启计算机、执行屏幕保护、在应用程序中启动其他程序、使用多媒体定时器、使用定时器、使应用... -
c++多线程编程初学实例一.docx
2020-04-29 22:22:12本文介绍了CPU多线程编程...系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。 -
Eggjs学习系列(七) 多进程实践
2020-04-17 00:56:14为了更好地利用多核环境,Node.js 提供了 Cluster 模块,可以方便的创建多个子进程,提高项目运行效率。 Cluster 模块 Cluster 模块将进程分为 Master 进程和 Worker 进程: 负责启动其他进程的叫做 Master 进程,只... -
Python的多进程运行
2020-04-17 14:46:13Python的多进程运行 微信关注公众号:夜寒信息 ...多进程在任务的执行使用非常广泛,比如Windows可以同时开很多的窗口,QQ,微信,游戏等。以后我们也会讲解多线程,多线程常用于下载,以后会有讲解。 要使用多... -
Windows进程间共享内存通信实例
2015-10-23 16:51:33Windows进程间共享内存通信实例 -
进程通讯、命名管道、一对多连接
2017-06-08 15:06:41进程通讯实现的多个客户端连接同一个命名管道 -
python多进程与进程间通信:fork()方法和multiprocess实例
2019-03-18 10:31:36fork()方法(windows不可用) 跨平台multiprocessing 进程池Pool 进程间通信 Queue pipe() Manager 注意事项 参考资料 考虑到现在电脑一般都有双核甚至四核的CPU,故可设计算法并行的方法,通过python编程... -
Python多进程
2020-03-26 20:45:08多进程访问冲突 多进程通信 mp.Queue mp.Pipe Value\Array Manager共享Value、Array、dict、list、Lock、Semaphore等 mp.Manager共享自定义类的实例对象 Python进程池 参考 上接Python多线程,简单记录一下...