请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

C++ 进程和匿名管道使用学习

[复制链接]
查看: 24|回复: 0

2万

主题

3万

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
79479
发表于 2020-1-14 14:26 | 显示全部楼层 |阅读模式
平台

Windows10 + VS2015
进修内容


  • 进程的建立操纵(CreateProcess方式)
  • 父子进程间匿名管道通讯
关连函数及参数先容


  • CreatePipe函数:该的原型为
  1. CreatePipe(_Out_ PHANDLE hReadPipe,           _Out_ PHANDLE hWritePipe,           _In_opt_ LPSECURITY_ATTRIBUTES lpPipeAttributes,           _In_ DWORD nSize);
复制代码
hReadPipe:返回一个可用于读管道数据的文件句柄;hWritePipe:返回一个可用于写管道数据的文件句柄;lpPipeAttributes:传入一个SECURITY_ATTRIBUTES结构的指针,该结构用于决议该函数返回的句柄能否可被子进程继续;nSize:管道的缓冲区巨细,可是这仅仅只是一个理想值,系统按照这个值建立巨细附近的缓冲区。假如传入0 ,那末系统将操纵一个默许的缓冲区巨细。必要留意读写管道数据的句柄参数位置

  • LPSECURITY_ATTRIBUTES典范:关连界说内容为
  1. typedef struct _SECURITY_ATTRIBUTES {    DWORD nLength;    LPVOID lpSecurityDescriptor;    BOOL bInheritHandle;} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
复制代码
nLength:结构体的巨细,可用sizeof获得;lpSecurityDescriptor:平安描摹符;bInheritHandle:平安描摹的工具能否被新建立的进程继续。

  • CreateProcess函数:WIN32API函数CreateProcess用来建立一个新的进程和它的主线程,这个新进程运转指定的可实行文件。该函数原型有两种大要,当前情况已界说UNICODE,只参考CreateProcessW
  1. #ifdef UNICODE#define CreateProcess  CreateProcessW#else#define CreateProcess  CreateProcessA#endif // !UNICODEWINBASEAPIBOOLWINAPICreateProcessW(    _In_opt_ LPCWSTR lpApplicationName,    _Inout_opt_ LPWSTR lpCommandLine,    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,    _In_ BOOL bInheritHandles,    _In_ DWORD dwCreationFlags,    _In_opt_ LPVOID lpEnvironment,    _In_opt_ LPCWSTR lpCurrentDirectory,    _In_ LPSTARTUPINFOW lpStartupInfo,    _Out_ LPPROCESS_INFORMATION lpProcessInformation    );
复制代码
lpApplicationName:指向一个NULL末端的、用来指定可实行模块的字符串,这个参数可以被设为NULL,在这类情况下,可实行模块的名字必须处于 lpCommandLine 参数最前面并由空格符与后背的字符分隔;lpCommandLine:指向一个以NULL末端的字符串,该字符串指定要实行的命令行,这个参数可以为空,那末函数将操纵lpApplicationName参数指定的字符串当做要运转的步伐的命令行;lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构体,这个结构体决议能否返回的句柄可以被子进程继续;lpThreadAttributes:同lpProcessAttribute,不外这个参数决议的是线程能否被继续.凡是置为NULL;bInheritHandles:指示新进程能否从挪用进程处继续了句柄,假如参数的值为真,挪用进程中的每一个可继续的翻开句柄都将被子进程继续,被继续的句柄与原进程具有完全类似的值和拜候权限;dwCreationFlags:指定附加的、用来控制优先类和进程的建立的标志;lpEnvironment:指向一个新进程的情况块,假如此参数为空,新进程操纵挪用进程的情况;lpCurrentDirectory:指向一个以NULL末端的字符串,这个字符串用来指定子进程的工作途径,这个字符串必须是一个包含驱动器名的绝对途径;lpStartupInfo指向一个用于决议新进程的主窗体怎样表示的STARTUPINFO结构体;lpProcessInformation:指向一个用来吸收新进程的识别信息的PROCESS_INFORMATION结构体。

  • dwCreationFlags参数:dwCreationFlags可选典范列表以下
参数值描摹CREATE_DEFAULT_ERROR_MODE新的进程不继续挪用进程的毛病形式CREATE_NEW_CONSOLE新的进程将操纵一个新的控制台,而不是继续父进程的控制台。这个标志不能与DETACHED_PROCESS标志一路操纵CREATE_NEW_PROCESS_GROUP新进程将是一个进程树的根进程CREATE_SEPARATE_WOW_VDM假如被设备,新进程将会在一个私有的捏造DOS机(VDM)中运转CREATE_SHARED_WOW_VDM假如WIN.INI中的Windows段的DefaultSeparateVDM选项被设备为真,这个标识使得CreateProcess函数超出这个选项并在同享的捏造DOS机中运转新进程CREATE_SUSPENDED新进程的主线程会以停息的状态被建立,直到挪用ResumeThread函数被挪用时才运转CREATE_UNICODE_ENVIRONMENT假如被设备,由lpEnvironment参数指定的情况块操纵Unicode字符,假如为空,情况块操纵ANSI字符DEBUG_PROCESS假如这个标志被设备,挪用进程将被当做一个调试步伐,而且新进程会被当做被调试的进程。系统把被调试步伐发生的全数调试变乱看护给调试器,假如操纵这个标志建立进程,只要挪用进程(挪用CreateProcess函数的进程)可以挪用WaitForDebugEvent函数DEBUG_ONLY_THIS_PROCESS假如此标志没有被设备且挪用进程正在被调试,新进程将成为调试挪用进程的调试器的另一个调试工具。假如挪用进程没有被调试,有关调试的行为就不会发生DETACHED_PROCESS对于控制台进程,新进程没有拜候父进程控制台的权限。新进程可以经过AllocConsole函数自己建立一个新的控制台。这个标志不成以与CREATE_NEW_CONSOLE标志一路操纵CREATE_NO_WINDOW系统不为新进程建立CUI窗口,操纵该标志可以建立不含窗口的CUI步伐HIGH_PRIORITY_CLASS指示这个进程将实行时候临界的使命,所以它必须被立即运转以保证正确。这个优先级的步伐优先于一般优先级或余暇优先级的步伐IDLE_PRIORITY_CLASS指示这个进程的线程只要在系统余暇时才会运转而且可以被任何高优先级的使命打断NORMAL_PRIORITY_CLASS指示这个进程没有特此外使命调节要求REALTIME_PRIORITY_CLASS指示这个进程具有可用的最高优先级。一个具有实时优先级的进程的线程可以打断全数其他进程线程的实行,包含正在实行垂危使命的系统进程

  • STARTUPINFO参数:该参数原型有两种大要,当前情况已界说UNICODE,只参考STARTUPINFOW
  1. #ifdef UNICODEtypedef STARTUPINFOW STARTUPINFO;typedef LPSTARTUPINFOW LPSTARTUPINFO;#elsetypedef STARTUPINFOA STARTUPINFO;typedef LPSTARTUPINFOA LPSTARTUPINFO;#endif // UNICODEtypedef struct _STARTUPINFOW {    DWORD   cb;    LPWSTR  lpReserved;    LPWSTR  lpDesktop;    LPWSTR  lpTitle;    DWORD   dwX;    DWORD   dwY;    DWORD   dwXSize;    DWORD   dwYSize;    DWORD   dwXCountChars;    DWORD   dwYCountChars;    DWORD   dwFillAttribute;    DWORD   dwFlags;    WORD    wShowWindow;    WORD    cbReserved2;    LPBYTE  lpReserved2;    HANDLE  hStdInput;    HANDLE  hStdOutput;    HANDLE  hStdError;} STARTUPINFOW, *LPSTARTUPINFOW;
复制代码
结构体参数内容较多,练习操纵时只用到了cb``dwFlags``wShowWindow``hStdInput``hStdOutput``hStdError,具体参数表白以下表
参数描摹cb包含STARTUPINFO结构中的字节数,利用步伐必须将cb初始化为sizeof(STARTUPINFO)lpReserved保存,必须初始化为NULLlpDesktop用于标识启动利用步伐地点的桌面的名字。假如该桌面存在,新进程便与指定的桌面关连联。假如桌面不存在,便建立一个带有默许属性的桌面,并操纵为新进程指定的名字。假如lpDesktop是NULL(这是最多见的情况),那末该进程将与当前桌面关连联lpTitle用于设定控制台窗口的称号。假如lpTitle是NULL,则可实行文件的名字将用作窗口名dwX用于设定利用步伐窗口在屏幕上应当放置的位置的x坐标(以像素为单元)dwY用于设定利用步伐窗口在屏幕上应当放置的位置的y坐标(以像素为单元),只要当子进程用CW_USEDEFAULT作为CreateWindow的x参数来建立它的第一个堆叠窗口时,才操纵这两个坐标。假如建立控制台窗口的利用步伐,这些成员用于指明控制台窗口的左上角dwXSize用于设定利用步伐窗口的宽度(以像素为单元)当子进程将CW_USEDEFAULT用作CreateWindow的nWidth参数来建立它的第一个堆叠窗口时,才操纵dwYSize用于设定利用步伐窗口的长度(以像素为单元)当子进程将CW_USEDEFAULT用作CreateWindow的nWidth参数来建立它的第一个堆叠窗口时,才操纵dwXCountChars用于设定子利用步伐的控制台窗口的宽度(以字符为单元)dwYCountChars用于设定子利用步伐的控制台窗口的高度(以字符为单元)dwFillAttribute用于设定子利用步伐的控制台窗口操纵的文本和背景色彩dwFlags子进程窗口标志wShowWindow用于设定假如子利用步伐初度挪用的ShowWindow将SW_SHOWDEFAULT作为nCmdShow参数传递时,该利用步伐的第一个堆叠窗口应当怎样出现cbReserved2保存,必须被初始化为0lpReserved2保存,必须被初始化为NULLhStdInput用于设定供控制台输入用的缓存的句柄hStdOutput用于设定供控制台输出用的缓存的句柄hStdError用于设定供控制台输出用的缓存的句柄

  • dwFlags参数:该参数可选典范以下
参数描摹STARTF_USESIZE操纵dwXSize和dwYSize成员STARTF_USESHOWWINDOW操纵wShowWindow成员STARTF_USEPOSITION操纵dwX和dwY成员STARTF_USECOUNTCHARS操纵dwXCountChars和dwYCountChars成员STARTF_USEFILLATTRIBUTE操纵dwFillAttribute成员STARTF_USESTDHANDLES操纵hStdInput、hStdOutput和hStdError成员STARTF_RUN_FULLSCREEN逼迫在x86盘算机上运转的控制台利用步伐以全屏幕方式启动运转父进程代码

1 .父进程的功用是建立管道和建立进程
2 .建立乐成后等待控制台输入信息并经过管道发送给子进程
3 .等待一段时候后从管道读取数据
4 .将管道数据输出到控制台
[code]#include #include using namespace std;char rxbuff[100] = { 0 };char txbuff[100] = { 0 };DWORD txcount = 0, rxcount = 0;void main(void){    SECURITY_ATTRIBUTES sa;    sa.nLength = sizeof(SECURITY_ATTRIBUTES);    sa.lpSecurityDescriptor = NULL;    sa.bInheritHandle = TRUE;    //管道建立    HANDLE hwrite, hread;    if (CreatePipe(&hread,&hwrite,&sa,0)==NULL)    {        cout
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表